diff --git a/anchors.min.js b/anchors.min.js index d7f2855a..025adca7 100644 --- a/anchors.min.js +++ b/anchors.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Anchors=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const r=Object.prototype.hasOwnProperty;return t&&r.call(t,e)},r=t=>Object.prototype.toString.apply(t),s=t=>"function"==typeof t||"[object Function]"===r(t),n=t=>("[object Object]"===r(t)||"object"==typeof t||s(t))&&null!==t;class i{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(r,s){const i=this.attrs;return t(r)?s&&e(i,r)?(i[r]=s,this):i[r]:n(r)?(o=i,c=r,Object.keys(c).forEach((t=>{e(c,t)&&(o[t]=c[t])})),this):0===arguments.length?i:this;var o,c}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const o=t=>!!(n(t)&&t.nodeName&&t.tagName&&1===t.nodeType),c=t=>t*t,l=(e=null)=>{let r,s;return e?t(e)?s=document.querySelector(e):o(e)&&(s=e):(r=document.querySelectorAll("html,body"),s=r[0].scrollTop-r[1].scrollTop>=0?r[0]:r[1]),s},a=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=a(t.offsetParent)),e},h=(t,e="")=>{const r=e.replace(/^>/i,"");return!!(e&&r&&t)&&(t.matches?t.matches(r):!!t.msMatchesSelector&&t.msMatchesSelector(r))},d=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,u=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],p=(t,e,r)=>{const s=u.indexOf(e)>-1;r._delegateListener&&delete(r=r._delegateListener)._delegateListener,function(t,e,r){const s=t._listeners;let n=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const i=t.fn;e===t.type&&(n=s,i===r&&(n=s))})),n>-1&&s.splice(n,1)}(t,e,r),t.removeEventListener(e,r,s)},m=function(e,r,s=!1){const n=t(e)?document.querySelector(e):e,i=n.childNodes,c=((e,r)=>{let s=e._listeners||[];return t(r)&&r&&(s=s.filter((t=>t.type===r))),s})(n,r);c.forEach((t=>{p(n,t.type,t.fn)})),(s||!0===r||1===arguments.length)&&n&&i&&i.forEach((t=>{o(t)&&m(t,r,s)}))},f=(t,e,r)=>{if(!s(r))return m(t,e);p(t,e,r)},g=(t,e,r,s,n,i,o=!1)=>{const c=u.indexOf(r)>-1,l=function(c){const a=function(t){const e=t.target;return(r=e)&&3===r.nodeType?r.parentNode:r;var r}(c),u=((t,e,r,s)=>{const n=r||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===n&&h(t,e):h(t,e))||s&&t===n)return t;if(t===n)break}while(t=d(t))})(a,e,t);let p=i||t;c.delegateTarget=u,!0===i&&(p=n),u&&(!0===o&&f(t,r,l),s.call(p,c,n))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:r,fn:l,data:n,context:i,capture:c}),s._delegateListener=l,t.addEventListener(r,l,c)},y={},b=t=>e(y,t)&&y[t].length>0,v=(t,e=!0)=>e?b(t):(t=>{let e=b(t),r=t.lastIndexOf(".");for(;!e&&-1!==r;)r=(t=t.substring(0,r)).lastIndexOf("."),e=b(t);return e})(t),A=(t,e,s=!0)=>{const n=t=>{if(!b(t))return!1;y[t].forEach((t=>{const s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(r(e))>-1?e.toString():e;t.callback.call(t.context||t,s)}))},i=()=>{let e=t,r=t.lastIndexOf(".");for(;-1!==r;)e=e.substring(0,r),r=e.lastIndexOf("."),n(e);n(t),n("*")};if(!v(t))return!1;s?setTimeout(i,10):i()},$=t=>Array.isArray?Array.isArray(t):"[object Array]"===r(t),x=['','','','','','','','',''],E=(e,r="icon")=>t(e)?((t,e="icon")=>{const r=/id="(.*?)"/,s=/^(\w+)-/;return x.find((n=>{const i=r.exec(n)[1];return s.exec(i)[1]===e&&i===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,r):[...x],L=(e="")=>{const r=document.body;let s=document.querySelector("#outline-icons"),n=[];(e=>{if(!e)return!1;$(e)&&e.length>0?e.forEach((e=>{-1===x.indexOf(e)&&t(e)&&x.push(e)})):t(e)&&x.push(e)})(e),n=E(),s?s.innerHTML=n.join(""):(s=document.createElement("div"),s.innerHTML=``,r.insertBefore(s.firstChild,r.firstChild))},T=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),M=t=>{return!(!n(t)||!(o(t)||(t=>!(!n(t)||"[object NodeList]"!==r(t)))(t)||(e=t,n(e)&&"[object DocumentFragment]"===r(e))||(t=>!(!n(t)||!("[object Text]"===r(t)||t.tagName&&3===t.nodeType)))(t)));var e},z=(t,e,r)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=r;break;case"value":"input"===s||"textarea"===s?t.value=r:t.setAttribute(e,r);break;case"className":t.className=r;break;default:t.setAttribute(e,r)}},w=e=>{const r=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&r.test(e)},j=(e,r={})=>((e,r={})=>{const s=r.size||0,n=r.color||"",i=r.iconSet||"",o=$(s)?s[0]:s,c=$(s)?s[1]:s,l=s?`width:${o}px;height:${c}px;`:"",a=n?l+`color:${n}`:l,h=document.createElement("i");let d,u="",p="";return t(e)?(w(e)?p=e:(u=i&&"icon"!==i?`xlink:href="#${i}-icon-${e}"`:`xlink:href="#icon-${e}"`,p=``),h.className="outline-icon",h.innerHTML=p,w(e)&&(d=h.querySelector("svg"),d.setAttribute("aria-hidden","true"),d.setAttribute("xmlns","http://www.w3.org/2000/svg"),d.setAttribute("class","outline-icon__svg"),d.setAttribute("width","200"),d.setAttribute("height","200"),d.style=a),h):null})(e,r),S=(r,s,i)=>{const o=document.createDocumentFragment(),c="outline-heading",l=i.hasAnchor||!0,a=i.isAtStart||!0,h=i.showCode||!1,d=i.chapterCode||"",u=i.anchorURL||"",p=`heading-${s}`,m={id:p,className:a?`${c} ${c}_start`:c,"data-id":s},f=Object.keys(m),g=T(r.innerHTML);let y,b;if(f.forEach((t=>{z(r,t,m[t])})),h&&(r.innerHTML=d+" "+g),!l)return!1;b=j("hash",{iconSet:"outline"}),y=((r,s,i)=>{const o=document.createDocumentFragment(),c=document.createElement(r),l=e=>M(e)||t(e),a=e=>{let r;if(!l(e))return!1;M(e)?r=e:t(e)&&(r=document.createTextNode(e)),o.appendChild(r)};return n(s)?Object.keys(s).forEach((t=>{e(s,t)&&z(c,t,s[t])})):$(s)&&s.every((t=>l(t)))&&s.forEach((t=>{a(t)})),$(i)?i.forEach((t=>{a(t)})):a(i),c.appendChild(o),c})("a",{id:`anchor-${s}`,className:`${c}__anchor anchor-${s}`,href:u||`#${p}`,target:u?"_blank":"self","data-id":s},[b]),o.appendChild(y),r.appendChild(o)},N=(t,e)=>{let r,s=t.className;if(!s||!((t,e)=>{const r=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,n;return!!o(t)&&(s=t.className,!!s&&(n=t.classList,n?.contains?t.classList.contains(e):!!r.exec(s)))})(t,e))return!1;r=t.classList,r?.remove?r.remove(e):(s=T(s.replace(e,"")),t.className=s)},_=(e,r=!0,s=!0)=>{const n="outline-heading",i=e.innerHTML;let o;if(e.innerHTML=i.replace(/^\d+(\.?\d+)*\s?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),N(e,n),!r)return!1;var c;o=e.querySelector(`.${n}__anchor`),s&&N(e,`${n}_start`),c=T(e.className),t(c)&&""===c&&e.removeAttribute("class"),e.removeChild(o)},H=(e,r=!0,n=null)=>{let i=1,o=0,c="";const l=[];return e.forEach(((e,r)=>{const a=e.tagName,h=a.replace(/h/i,"");let d=parseInt(h,10),u=-1;var p;d>i?(o+=1,u=1===o?-1:r-1):d===i||do?1===d?(o=1,u=-1):u=l[r-1].pid:d<=o&&(1===d?o=1:(o-=i-d,o<=1&&(o=1)),u=1===o?-1:((t,e,r)=>{let s,n,i=t[r-1];for(n=0;n]+(>|$)/g,""):"",s(n)&&(c=n(c)),l.push({id:r,pid:u,level:o,rel:`heading-${r}`,text:c,tagName:a})})),r?(t=>{const e={};return t.forEach((t=>{const r=JSON.stringify((t=>[t.pid])(t));e[r]=e[r]||[],e[r].push(t),t.index=e[r].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const r=e[`[${t.id}]`];if(!r||!$(r))return!1;r.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(l):l};class C extends i{constructor(t){super(),this.attrs=C.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){const r=this.attr("showCode")||!0;let n,i,c,a,h;return this.attr(e),h=this.attr("articleElement"),i=this.attr("scrollElement"),c=this.attr("selector"),n=this.attr("created"),t(h)?a=document.querySelector(h):o(h)&&(a=h),a?(this.$articleElement=a,this.$scrollElement=l(i),this.$headings=[...a.querySelectorAll(c)],this.$headings.length<1||(this.chapters=H(this.$headings,r,this.attr("chapterTextFilter")),s(n)&&n.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,r)=>{const s={},n=[];return t.forEach(((t,r)=>{s[t[e]]=r,t.children=[]})),t.forEach((e=>{const i=t[s[e[r]]];-1!==e[r]?i.children.push(e):n.push(e)})),n})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),r=this.attr("isAtStart"),n=this.attr("showCode"),i=this.attr("anchorURL"),o=this.$headings,c=this.getChapters();return L(),o.forEach(((t,s)=>{const o=c[s].code;S(t,s,{hasAnchor:e,isAtStart:r,showCode:n,chapterCode:o,anchorURL:i})})),s(t)&&t.call(this),this}scrollTo(t,e){return((t,e,r)=>{const n=l(t);let i=n.scrollTop,o=0;const a=e-i,h=n.scrollHeight,d=e-h<=0?e:h,u=t=>(s(r)&&r(t),!1),p=()=>{if(o+=1,a<0){if(i-=c(o),n.scrollTop=i,i<=e)return n.scrollTop=e,u(e)}else if(i+=c(o),n.scrollTop=i,i>=d)return n.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)})(this.$scrollElement,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),r=this.attr("beforeDestroy"),n=this.attr("afterDestroy"),i=this.$headings;return s(r)&&r.call(this),this.removeListeners(),i.forEach((r=>{_(r,t,e)})),this.attr(C.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],s(n)&&n.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),r=this.attr("afterScroll"),n=this.attr("stickyHeight"),i=t.delegateTarget.parentNode,o=a(i)-(n+10),c=this.$scrollElement,l=c.scrollHeight-c.clientHeight;return this.scrollTo(o,(()=>{s(r)&&r.call(this,"anchor"),((t,e=300)=>{!!s(t)&&setTimeout((()=>{t()}),e)})((()=>{A("toolbar:update",{top:o,min:0,max:l})}))})),e||function(t){t.stopPropagation(),t.preventDefault()}(t),this}addListeners(){const t=this.$articleElement;return g(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return f(t,"click",this.onAnchorTrigger),this}}return C.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null},C})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Anchors=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const r=Object.prototype.hasOwnProperty;return t&&r.call(t,e)},r=t=>Object.prototype.toString.apply(t),s=t=>"function"==typeof t||"[object Function]"===r(t),n=t=>("[object Object]"===r(t)||"object"==typeof t||s(t))&&null!==t;class i{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(r,s){const i=this.attrs;return t(r)?s&&e(i,r)?(i[r]=s,this):i[r]:n(r)?(o=i,c=r,Object.keys(c).forEach((t=>{e(c,t)&&(o[t]=c[t])})),this):0===arguments.length?i:this;var o,c}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const o=t=>!!(n(t)&&t.nodeName&&t.tagName&&1===t.nodeType),c=t=>t*t,l=(e=null)=>{let r,s;return e?t(e)?s=document.querySelector(e):o(e)&&(s=e):(r=document.querySelectorAll("html,body"),s=r[0].scrollTop-r[1].scrollTop>=0?r[0]:r[1]),s},a=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=a(t.offsetParent)),e},h=(t,e="")=>{const r=e.replace(/^>/i,"");return!!(e&&r&&t)&&(t.matches?t.matches(r):!!t.msMatchesSelector&&t.msMatchesSelector(r))},d=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,u=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],p=(t,e,r)=>{const s=u.indexOf(e)>-1;r._delegateListener&&delete(r=r._delegateListener)._delegateListener,function(t,e,r){const s=t._listeners;let n=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const i=t.fn;e===t.type&&(n=s,i===r&&(n=s))})),n>-1&&s.splice(n,1)}(t,e,r),t.removeEventListener(e,r,s)},m=function(e,r,s=!1){const n=t(e)?document.querySelector(e):e,i=n.childNodes,c=((e,r)=>{let s=e._listeners||[];return t(r)&&r&&(s=s.filter((t=>t.type===r))),s})(n,r);c.forEach((t=>{p(n,t.type,t.fn)})),(s||!0===r||1===arguments.length)&&n&&i&&i.forEach((t=>{o(t)&&m(t,r,s)}))},f=(t,e,r)=>{if(!s(r))return m(t,e);p(t,e,r)},g=(t,e,r,s,n,i,o=!1)=>{const c=u.indexOf(r)>-1,l=function(c){const a=function(t){const e=t.target;return(r=e)&&3===r.nodeType?r.parentNode:r;var r}(c),u=((t,e,r,s)=>{const n=r||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===n&&h(t,e):h(t,e))||s&&t===n)return t;if(t===n)break}while(t=d(t))})(a,e,t);let p=i||t;c.delegateTarget=u,!0===i&&(p=n),u&&(!0===o&&f(t,r,l),s.call(p,c,n))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:r,fn:l,data:n,context:i,capture:c}),s._delegateListener=l,t.addEventListener(r,l,c)},y={},b=t=>e(y,t)&&y[t].length>0,v=(t,e=!0)=>e?b(t):(t=>{let e=b(t),r=t.lastIndexOf(".");for(;!e&&-1!==r;)r=(t=t.substring(0,r)).lastIndexOf("."),e=b(t);return e})(t),A=(t,e,s=!0)=>{const n=t=>{if(!b(t))return!1;y[t].forEach((t=>{const s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(r(e))>-1?e.toString():e;t.callback.call(t.context||t,s)}))},i=()=>{let e=t,r=t.lastIndexOf(".");for(;-1!==r;)e=e.substring(0,r),r=e.lastIndexOf("."),n(e);n(t),n("*")};if(!v(t))return!1;s?setTimeout(i,10):i()},$=t=>Array.isArray?Array.isArray(t):"[object Array]"===r(t),x=['','','','','','','','',''],E=(e,r="icon")=>t(e)?((t,e="icon")=>{const r=/id="(.*?)"/,s=/^(\w+)-/;return x.find((n=>{const i=r.exec(n)[1];return s.exec(i)[1]===e&&i===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,r):[...x],L=(e="")=>{const r=document.body;let s=document.querySelector("#outline-icons"),n=[];(e=>{if(!e)return!1;$(e)&&e.length>0?e.forEach((e=>{-1===x.indexOf(e)&&t(e)&&x.push(e)})):t(e)&&x.push(e)})(e),n=E(),s?s.innerHTML=n.join(""):(s=document.createElement("div"),s.innerHTML=``,r.insertBefore(s.firstChild,r.firstChild))},T=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),M=t=>{return!(!n(t)||!(o(t)||(t=>!(!n(t)||"[object NodeList]"!==r(t)))(t)||(e=t,n(e)&&"[object DocumentFragment]"===r(e))||(t=>!(!n(t)||!("[object Text]"===r(t)||t.tagName&&3===t.nodeType)))(t)));var e},z=(t,e,r)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=r;break;case"value":"input"===s||"textarea"===s?t.value=r:t.setAttribute(e,r);break;case"className":t.className=r;break;default:t.setAttribute(e,r)}},w=e=>{const r=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&r.test(e)},j=(e,r={})=>((e,r={})=>{const s=r.size||0,n=r.color||"",i=r.iconSet||"",o=$(s)?s[0]:s,c=$(s)?s[1]:s,l=s?`width:${o}px;height:${c}px;`:"",a=n?l+`color:${n}`:l,h=document.createElement("i");let d,u="",p="";return t(e)?(w(e)?p=e:(u=i&&"icon"!==i?`xlink:href="#${i}-icon-${e}"`:`xlink:href="#icon-${e}"`,p=``),h.className="outline-icon",h.innerHTML=p,w(e)&&(d=h.querySelector("svg"),d.setAttribute("aria-hidden","true"),d.setAttribute("xmlns","http://www.w3.org/2000/svg"),d.setAttribute("class","outline-icon__svg"),d.setAttribute("width","200"),d.setAttribute("height","200"),d.style.cssText=a),h):null})(e,r),S=(r,s,i)=>{const o=document.createDocumentFragment(),c="outline-heading",l=i.hasAnchor||!0,a=i.isAtStart||!0,h=i.showCode||!1,d=i.chapterCode||"",u=i.anchorURL||"",p=`heading-${s}`,m={id:p,className:a?`${c} ${c}_start`:c,"data-id":s},f=Object.keys(m),g=T(r.innerHTML);let y,b;if(f.forEach((t=>{z(r,t,m[t])})),h&&(r.innerHTML=d+" "+g),!l)return!1;b=j("hash",{iconSet:"outline"}),y=((r,s,i)=>{const o=document.createDocumentFragment(),c=document.createElement(r),l=e=>M(e)||t(e),a=e=>{let r;if(!l(e))return!1;M(e)?r=e:t(e)&&(r=document.createTextNode(e)),o.appendChild(r)};return n(s)?Object.keys(s).forEach((t=>{e(s,t)&&z(c,t,s[t])})):$(s)&&s.every((t=>l(t)))&&s.forEach((t=>{a(t)})),$(i)?i.forEach((t=>{a(t)})):a(i),c.appendChild(o),c})("a",{id:`anchor-${s}`,className:`${c}__anchor anchor-${s}`,href:u||`#${p}`,target:u?"_blank":"self","data-id":s},[b]),o.appendChild(y),r.appendChild(o)},N=(t,e)=>{let r,s=t.className;if(!s||!((t,e)=>{const r=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,n;return!!o(t)&&(s=t.className,!!s&&(n=t.classList,n?.contains?t.classList.contains(e):!!r.exec(s)))})(t,e))return!1;r=t.classList,r?.remove?r.remove(e):(s=T(s.replace(e,"")),t.className=s)},_=(e,r=!0,s=!0)=>{const n="outline-heading",i=e.innerHTML;let o;if(e.innerHTML=i.replace(/^\d+(\.?\d+)*\s?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),N(e,n),!r)return!1;var c;o=e.querySelector(`.${n}__anchor`),s&&N(e,`${n}_start`),c=T(e.className),t(c)&&""===c&&e.removeAttribute("class"),e.removeChild(o)},H=(e,r=!0,n=null)=>{let i=1,o=0,c="";const l=[];return e.forEach(((e,r)=>{const a=e.tagName,h=a.replace(/h/i,"");let d=parseInt(h,10),u=-1;var p;d>i?(o+=1,u=1===o?-1:r-1):d===i||do?1===d?(o=1,u=-1):u=l[r-1].pid:d<=o&&(1===d?o=1:(o-=i-d,o<=1&&(o=1)),u=1===o?-1:((t,e,r)=>{let s,n,i=t[r-1];for(n=0;n]+(>|$)/g,""):"",s(n)&&(c=n(c)),l.push({id:r,pid:u,level:o,rel:`heading-${r}`,text:c,tagName:a})})),r?(t=>{const e={};return t.forEach((t=>{const r=JSON.stringify((t=>[t.pid])(t));e[r]=e[r]||[],e[r].push(t),t.index=e[r].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const r=e[`[${t.id}]`];if(!r||!$(r))return!1;r.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(l):l};class C extends i{constructor(t){super(),this.attrs=C.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){const r=this.attr("showCode")||!0;let n,i,c,a,h;return this.attr(e),h=this.attr("articleElement"),i=this.attr("scrollElement"),c=this.attr("selector"),n=this.attr("created"),t(h)?a=document.querySelector(h):o(h)&&(a=h),a?(this.$articleElement=a,this.$scrollElement=l(i),this.$headings=[...a.querySelectorAll(c)],this.$headings.length<1||(this.chapters=H(this.$headings,r,this.attr("chapterTextFilter")),s(n)&&n.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,r)=>{const s={},n=[];return t.forEach(((t,r)=>{s[t[e]]=r,t.children=[]})),t.forEach((e=>{const i=t[s[e[r]]];-1!==e[r]?i.children.push(e):n.push(e)})),n})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),r=this.attr("isAtStart"),n=this.attr("showCode"),i=this.attr("anchorURL"),o=this.$headings,c=this.getChapters();return L(),o.forEach(((t,s)=>{const o=c[s].code;S(t,s,{hasAnchor:e,isAtStart:r,showCode:n,chapterCode:o,anchorURL:i})})),s(t)&&t.call(this),this}scrollTo(t,e){return((t,e,r)=>{const n=l(t);let i=n.scrollTop,o=0;const a=e-i,h=n.scrollHeight,d=e-h<=0?e:h,u=t=>(s(r)&&r(t),!1),p=()=>{if(o+=1,a<0){if(i-=c(o),n.scrollTop=i,i<=e)return n.scrollTop=e,u(e)}else if(i+=c(o),n.scrollTop=i,i>=d)return n.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)})(this.$scrollElement,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),r=this.attr("beforeDestroy"),n=this.attr("afterDestroy"),i=this.$headings;return s(r)&&r.call(this),this.removeListeners(),i.forEach((r=>{_(r,t,e)})),this.attr(C.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],s(n)&&n.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),r=this.attr("afterScroll"),n=this.attr("stickyHeight"),i=t.delegateTarget.parentNode,o=a(i)-(n+10),c=this.$scrollElement,l=c.scrollHeight-c.clientHeight;return this.scrollTo(o,(()=>{s(r)&&r.call(this,"anchor"),((t,e=300)=>{!!s(t)&&setTimeout((()=>{t()}),e)})((()=>{A("toolbar:update",{top:o,min:0,max:l})}))})),e||function(t){t.stopPropagation(),t.preventDefault()}(t),this}addListeners(){const t=this.$articleElement;return g(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return f(t,"click",this.onAnchorTrigger),this}}return C.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null},C})); //# sourceMappingURL=anchors.min.js.map diff --git a/anchors.min.js.map b/anchors.min.js.map index 42c17a6a..7e7efdf1 100644 --- a/anchors.min.js.map +++ b/anchors.min.js.map @@ -1 +1 @@ -{"version":3,"file":"anchors.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/types/isElement.js","src/utils/lang/easeInQuad.js","src/utils/dom/_getScrollElement.js","src/utils/dom/offsetTop.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/observer/_subscribers.js","src/utils/observer/_hasDirectSubscribersFor.js","src/utils/observer/has.js","src/utils/observer/_hasSubscribers.js","src/utils/observer/emit.js","src/utils/types/isTypedArray.js","src/utils/types/isArray.js","src/utils/icons/symbols.js","src/utils/icons/defaults.js","src/utils/icons/getSymbols.js","src/utils/icons/getSymbol.js","src/utils/icons/paint.js","src/utils/icons/add.js","src/utils/lang/trim.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/setAttribute.js","src/utils/types/isSVG.js","src/utils/icons/icon.js","src/utils/icons/createElement.js","src/_updateHeading.js","src/utils/dom/createElement.js","src/utils/dom/removeClass.js","src/utils/dom/hasClass.js","src/_resetHeading.js","src/utils/types/isEmpty.js","src/getChapters.js","src/utils/lang/stripTags.js","src/_getChapterParentIdByDiffer.js","src/_getChaptersWithCode.js","src/anchors.js","src/utils/lang/toTree.js","src/utils/dom/scrollTo.js","src/utils/lang/later.js","src/utils/event/stop.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from '../types/isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n let $rootElements\n let $scrollElement\n\n if (!scrollElement) {\n $rootElements = document.querySelectorAll('html,body')\n $scrollElement =\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n ? $rootElements[0]\n : $rootElements[1]\n } else {\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n }\n\n return $scrollElement\n}\n\nexport default _getScrollElement\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} data - (必须)数据对象\n * @param {Boolean} async - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg =\n `` +\n `` +\n ``\n }\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n if (isSVG(name)) {\n $svg = $icon.querySelector('svg')\n $svg.setAttribute('aria-hidden', 'true')\n $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n $svg.setAttribute('class', 'outline-icon__svg')\n $svg.setAttribute('width', '200')\n $svg.setAttribute('height', '200')\n $svg.style = cssRules\n }\n\n return $icon\n}\n\nexport default createElement\n","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttribute from './utils/dom/setAttribute'\n\nimport icon from './utils/icons/icon'\n\nconst _updateHeading = ($heading, i, options) => {\n const $fragment = document.createDocumentFragment()\n const CLS_HEADING = 'outline-heading'\n const hasAnchor = options.hasAnchor || true\n const isAtStart = options.isAtStart || true\n const showCode = options.showCode || false\n const chapterCode = options.chapterCode || ''\n const anchorURL = options.anchorURL || ''\n const headingId = `heading-${i}`\n const attrs = {\n id: headingId,\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\n 'data-id': i\n }\n const keys = Object.keys(attrs)\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n keys.forEach((prop) => {\n setAttribute($heading, prop, attrs[prop])\n })\n\n if (showCode) {\n $heading.innerHTML = chapterCode + ' ' + text\n }\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = icon('hash', { iconSet: 'outline' })\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL || `#${headingId}`,\n target: anchorURL ? '_blank' : 'self',\n 'data-id': i\n },\n [$icon]\n )\n $fragment.appendChild($anchor)\n $heading.appendChild($fragment)\n}\n\nexport default _updateHeading\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import removeClass from './utils/dom/removeClass'\nimport isEmpty from './utils/types/isEmpty'\nimport trim from './utils/lang/trim'\n\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\n let $anchor\n\n $heading.innerHTML = text.replace(pattern, '')\n $heading.removeAttribute('id')\n $heading.removeAttribute('data-id')\n\n removeClass($heading, CLS_HEADING)\n\n if (!hasAnchor) {\n return false\n }\n\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\n\n if (isAtStart) {\n removeClass($heading, `${CLS_HEADING}_start`)\n }\n\n if (isEmpty(trim($heading.className))) {\n $heading.removeAttribute('class')\n }\n\n $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\n","import isString from './isString'\n/**\n * 检测数据是否为空字符串\n * ========================================================================\n * @method isEmpty\n * @param {String} str\n * @returns {boolean}\n */\nconst isEmpty = (str) => {\n return isString(str) && str === ''\n}\n\nexport default isEmpty\n","import trim from './utils/lang/trim'\nimport stripTags from './utils/lang/stripTags'\nimport isFunction from './utils/types/isFunction'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\n/**\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\n * ========================================================================\n * @method getChapters\n * @param {Array} headings\n * @param {Boolean} [showCode]\n * @param {Function} [chapterTextFilter]\n * @return {*|*[]}\n */\nconst getChapters = (headings, showCode = true, chapterTextFilter = null) => {\n let previous = 1\n let level = 0\n let text = ''\n const chapters = []\n\n headings.forEach((heading, i) => {\n const tagName = heading.tagName\n const headingLevel = tagName.replace(/h/i, '')\n let current = parseInt(headingLevel, 10)\n let pid = -1\n\n // 场景1:当前标题是前一个标题的子标题\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\n // h2 (前一个标题)\n // h3 (当前标题)\n if (current > previous) {\n level += 1\n\n // 第一层级的 pid 是 -1\n if (level === 1) {\n pid = -1\n } else {\n pid = i - 1\n }\n }\n // 场景2:当前标题和前一个标题层级相同\n // 当前标题的(标题标签)序号 = 前一个标题的序号\n // h2 (前一个标题)\n // h2 (当前标题)\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\n // h2\n // h4 (前一个标题)\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\n else if (current === previous || (current < previous && current > level)) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n pid = -1\n } else {\n pid = chapters[i - 1].pid\n }\n }\n // 场景3:当前标题比前一个标题层级高\n else if (current <= level) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n } else {\n level = level - (previous - current)\n\n if (level <= 1) {\n level = 1\n }\n }\n\n // 第一级的标题\n if (level === 1) {\n pid = -1\n } else {\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\n }\n }\n\n previous = current\n\n text = stripTags(trim(heading.innerHTML))\n\n if (isFunction(chapterTextFilter)) {\n text = chapterTextFilter(text)\n }\n\n chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text,\n tagName\n })\n })\n\n return showCode ? _getChaptersWithCode(chapters) : chapters\n}\n\nexport default getChapters\n","import isString from '../types/isString'\n\n/**\n * 过滤所有 HTML 标签\n * ========================================================================\n * @method stripTags\n * @param {string} str\n * @returns {string}\n */\nconst stripTags = (str) => {\n if (!isString(str)) {\n return ''\n }\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\n}\n\nexport default stripTags\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\n let previous = chapters[index - 1]\n let pid\n let i\n\n for (i = 0; i < differ; i += 1) {\n pid = previous.pid\n previous = chapters[pid]\n }\n\n pid = previous.pid\n\n return pid\n}\n\nexport default _getChapterParentIdByDiffer\n","import isArray from './utils/types/isArray'\n\nconst _getChaptersWithCode = (chapters) => {\n const groups = {}\n const cb = (o) => {\n return [o.pid]\n }\n\n chapters.forEach((o) => {\n const group = JSON.stringify(cb(o))\n\n groups[group] = groups[group] || []\n groups[group].push(o)\n\n o.index = groups[group].length\n if (o.pid === -1) {\n o.code = String(o.index)\n }\n })\n\n Object.keys(groups).forEach((group) => {\n groups[group].forEach((c) => {\n const subjects = groups[`[${c.id}]`]\n if (!subjects || !isArray(subjects)) {\n return false\n }\n subjects.forEach((o) => {\n o.code = c.code + '.' + o.index\n })\n })\n })\n\n return chapters\n}\n\nexport default _getChaptersWithCode\n","import Base from './base'\n\n// 在文章的标题生成 anchor 链接\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport toTree from './utils/lang/toTree'\nimport later from './utils/lang/later'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport offsetTop from './utils/dom/offsetTop'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport publish from './utils/observer/emit'\nimport paint from './utils/icons/paint'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n const showCode = this.attr('showCode') || true\n let created\n let scrollElement\n let selector\n let $articleElement\n let articleElement\n\n this.attr(options)\n articleElement = this.attr('articleElement')\n scrollElement = this.attr('scrollElement')\n selector = this.attr('selector')\n created = this.attr('created')\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n if (!$articleElement) {\n return this\n }\n\n this.$articleElement = $articleElement\n this.$scrollElement = _getScrollElement(scrollElement)\n this.$headings = [...$articleElement.querySelectorAll(selector)]\n\n if (this.$headings.length < 1) {\n return this\n }\n\n this.chapters = getChapters(\n this.$headings,\n showCode,\n this.attr('chapterTextFilter')\n )\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n getChapters(isTreeStructured = false) {\n const chapters = this.chapters\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\n }\n\n count() {\n return this.chapters.length\n }\n\n render() {\n const mounted = this.attr('mounted')\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const $headings = this.$headings\n const chapters = this.getChapters()\n\n paint()\n\n $headings.forEach(($heading, i) => {\n const chapterCode = chapters[i].code\n _updateHeading($heading, i, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n destroy() {\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n onAnchorTrigger(evt) {\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const $heading = $anchor.parentNode\n const top = offsetTop($heading) - (stickyHeight + 10)\n const $scrollElement = this.$scrollElement\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'anchor')\n }\n\n later(() => {\n publish('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.scrollTo(top, after)\n\n if (!anchorURL) {\n stop(evt)\n }\n\n return this\n }\n\n addListeners() {\n const $articleElement = this.$articleElement\n\n on(\n $articleElement,\n '.outline-heading__anchor',\n 'click',\n this.onAnchorTrigger,\n this,\n true\n )\n\n return this\n }\n\n removeListeners() {\n const $articleElement = this.$articleElement\n\n off($articleElement, 'click', this.onAnchorTrigger)\n\n return this\n }\n}\n\nAnchors.DEFAULTS = {\n scrollElement: 'html,body',\n articleElement: '#article',\n selector: 'h1,h2,h3,h4,h5,h6',\n stickyHeight: 0,\n anchorURL: '',\n hasAnchor: true,\n isAtStart: true,\n showCode: false,\n created: null,\n mounted: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n chapterTextFilter: null\n}\n\nexport default Anchors\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n const $scrollElement = _getScrollElement(scrollElement)\n let scrollTop = $scrollElement.scrollTop\n let step = 0\n const distance = top - scrollTop\n const MAX_HEIGHT = $scrollElement.scrollHeight\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n const stop = (top) => {\n if (isFunction(afterStop)) {\n afterStop(top)\n }\n\n return false\n }\n const play = () => {\n step += 1\n\n // 向上滚动\n if (distance < 0) {\n scrollTop -= easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop <= top) {\n $scrollElement.scrollTop = top\n return stop(top)\n }\n } else {\n scrollTop += easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop >= MAX_TOP) {\n $scrollElement.scrollTop = MAX_TOP\n return stop(MAX_TOP)\n }\n }\n\n requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","offsetTop","el","top","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","fn","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","setTimeout","isArray","Array","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","exec","iconName","getSymbol","paint","$body","body","$icons","symbols","add","innerHTML","join","createElement","insertBefore","firstChild","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","className","isSVG","pattern","RegExp","test","icon","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","_updateHeading","$heading","$fragment","createDocumentFragment","CLS_HEADING","hasAnchor","isAtStart","showCode","chapterCode","anchorURL","headingId","id","text","$anchor","children","$el","isValidChild","child","append","createTextNode","appendChild","every","href","removeClass","classList","allClass","contains","hasClass","remove","_resetHeading","removeAttribute","removeChild","getChapters","headings","chapterTextFilter","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","scrollTo","after","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","delay","later","publish","min","stopPropagation","preventDefault"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"anchors.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/types/isElement.js","src/utils/lang/easeInQuad.js","src/utils/dom/_getScrollElement.js","src/utils/dom/offsetTop.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/observer/_subscribers.js","src/utils/observer/_hasDirectSubscribersFor.js","src/utils/observer/has.js","src/utils/observer/_hasSubscribers.js","src/utils/observer/emit.js","src/utils/types/isTypedArray.js","src/utils/types/isArray.js","src/utils/icons/symbols.js","src/utils/icons/defaults.js","src/utils/icons/getSymbols.js","src/utils/icons/getSymbol.js","src/utils/icons/paint.js","src/utils/icons/add.js","src/utils/lang/trim.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/setAttribute.js","src/utils/types/isSVG.js","src/utils/icons/icon.js","src/utils/icons/createElement.js","src/_updateHeading.js","src/utils/dom/createElement.js","src/utils/dom/removeClass.js","src/utils/dom/hasClass.js","src/_resetHeading.js","src/utils/types/isEmpty.js","src/getChapters.js","src/utils/lang/stripTags.js","src/_getChapterParentIdByDiffer.js","src/_getChaptersWithCode.js","src/anchors.js","src/utils/lang/toTree.js","src/utils/dom/scrollTo.js","src/utils/lang/later.js","src/utils/event/stop.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from '../types/isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n let $rootElements\n let $scrollElement\n\n if (!scrollElement) {\n $rootElements = document.querySelectorAll('html,body')\n $scrollElement =\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n ? $rootElements[0]\n : $rootElements[1]\n } else {\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n }\n\n return $scrollElement\n}\n\nexport default _getScrollElement\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} data - (必须)数据对象\n * @param {Boolean} async - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg =\n `` +\n `` +\n ``\n }\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n if (isSVG(name)) {\n $svg = $icon.querySelector('svg')\n $svg.setAttribute('aria-hidden', 'true')\n $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n $svg.setAttribute('class', 'outline-icon__svg')\n $svg.setAttribute('width', '200')\n $svg.setAttribute('height', '200')\n $svg.style.cssText = cssRules\n }\n\n return $icon\n}\n\nexport default createElement\n","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttribute from './utils/dom/setAttribute'\n\nimport icon from './utils/icons/icon'\n\nconst _updateHeading = ($heading, i, options) => {\n const $fragment = document.createDocumentFragment()\n const CLS_HEADING = 'outline-heading'\n const hasAnchor = options.hasAnchor || true\n const isAtStart = options.isAtStart || true\n const showCode = options.showCode || false\n const chapterCode = options.chapterCode || ''\n const anchorURL = options.anchorURL || ''\n const headingId = `heading-${i}`\n const attrs = {\n id: headingId,\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\n 'data-id': i\n }\n const keys = Object.keys(attrs)\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n keys.forEach((prop) => {\n setAttribute($heading, prop, attrs[prop])\n })\n\n if (showCode) {\n $heading.innerHTML = chapterCode + ' ' + text\n }\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = icon('hash', { iconSet: 'outline' })\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL || `#${headingId}`,\n target: anchorURL ? '_blank' : 'self',\n 'data-id': i\n },\n [$icon]\n )\n $fragment.appendChild($anchor)\n $heading.appendChild($fragment)\n}\n\nexport default _updateHeading\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import removeClass from './utils/dom/removeClass'\nimport isEmpty from './utils/types/isEmpty'\nimport trim from './utils/lang/trim'\n\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\n let $anchor\n\n $heading.innerHTML = text.replace(pattern, '')\n $heading.removeAttribute('id')\n $heading.removeAttribute('data-id')\n\n removeClass($heading, CLS_HEADING)\n\n if (!hasAnchor) {\n return false\n }\n\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\n\n if (isAtStart) {\n removeClass($heading, `${CLS_HEADING}_start`)\n }\n\n if (isEmpty(trim($heading.className))) {\n $heading.removeAttribute('class')\n }\n\n $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\n","import isString from './isString'\n/**\n * 检测数据是否为空字符串\n * ========================================================================\n * @method isEmpty\n * @param {String} str\n * @returns {boolean}\n */\nconst isEmpty = (str) => {\n return isString(str) && str === ''\n}\n\nexport default isEmpty\n","import trim from './utils/lang/trim'\nimport stripTags from './utils/lang/stripTags'\nimport isFunction from './utils/types/isFunction'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\n/**\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\n * ========================================================================\n * @method getChapters\n * @param {Array} headings\n * @param {Boolean} [showCode]\n * @param {Function} [chapterTextFilter]\n * @return {*|*[]}\n */\nconst getChapters = (headings, showCode = true, chapterTextFilter = null) => {\n let previous = 1\n let level = 0\n let text = ''\n const chapters = []\n\n headings.forEach((heading, i) => {\n const tagName = heading.tagName\n const headingLevel = tagName.replace(/h/i, '')\n let current = parseInt(headingLevel, 10)\n let pid = -1\n\n // 场景1:当前标题是前一个标题的子标题\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\n // h2 (前一个标题)\n // h3 (当前标题)\n if (current > previous) {\n level += 1\n\n // 第一层级的 pid 是 -1\n if (level === 1) {\n pid = -1\n } else {\n pid = i - 1\n }\n }\n // 场景2:当前标题和前一个标题层级相同\n // 当前标题的(标题标签)序号 = 前一个标题的序号\n // h2 (前一个标题)\n // h2 (当前标题)\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\n // h2\n // h4 (前一个标题)\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\n else if (current === previous || (current < previous && current > level)) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n pid = -1\n } else {\n pid = chapters[i - 1].pid\n }\n }\n // 场景3:当前标题比前一个标题层级高\n else if (current <= level) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n } else {\n level = level - (previous - current)\n\n if (level <= 1) {\n level = 1\n }\n }\n\n // 第一级的标题\n if (level === 1) {\n pid = -1\n } else {\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\n }\n }\n\n previous = current\n\n text = stripTags(trim(heading.innerHTML))\n\n if (isFunction(chapterTextFilter)) {\n text = chapterTextFilter(text)\n }\n\n chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text,\n tagName\n })\n })\n\n return showCode ? _getChaptersWithCode(chapters) : chapters\n}\n\nexport default getChapters\n","import isString from '../types/isString'\n\n/**\n * 过滤所有 HTML 标签\n * ========================================================================\n * @method stripTags\n * @param {string} str\n * @returns {string}\n */\nconst stripTags = (str) => {\n if (!isString(str)) {\n return ''\n }\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\n}\n\nexport default stripTags\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\n let previous = chapters[index - 1]\n let pid\n let i\n\n for (i = 0; i < differ; i += 1) {\n pid = previous.pid\n previous = chapters[pid]\n }\n\n pid = previous.pid\n\n return pid\n}\n\nexport default _getChapterParentIdByDiffer\n","import isArray from './utils/types/isArray'\n\nconst _getChaptersWithCode = (chapters) => {\n const groups = {}\n const cb = (o) => {\n return [o.pid]\n }\n\n chapters.forEach((o) => {\n const group = JSON.stringify(cb(o))\n\n groups[group] = groups[group] || []\n groups[group].push(o)\n\n o.index = groups[group].length\n if (o.pid === -1) {\n o.code = String(o.index)\n }\n })\n\n Object.keys(groups).forEach((group) => {\n groups[group].forEach((c) => {\n const subjects = groups[`[${c.id}]`]\n if (!subjects || !isArray(subjects)) {\n return false\n }\n subjects.forEach((o) => {\n o.code = c.code + '.' + o.index\n })\n })\n })\n\n return chapters\n}\n\nexport default _getChaptersWithCode\n","import Base from './base'\n\n// 在文章的标题生成 anchor 链接\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport toTree from './utils/lang/toTree'\nimport later from './utils/lang/later'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport offsetTop from './utils/dom/offsetTop'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport publish from './utils/observer/emit'\nimport paint from './utils/icons/paint'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n const showCode = this.attr('showCode') || true\n let created\n let scrollElement\n let selector\n let $articleElement\n let articleElement\n\n this.attr(options)\n articleElement = this.attr('articleElement')\n scrollElement = this.attr('scrollElement')\n selector = this.attr('selector')\n created = this.attr('created')\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n if (!$articleElement) {\n return this\n }\n\n this.$articleElement = $articleElement\n this.$scrollElement = _getScrollElement(scrollElement)\n this.$headings = [...$articleElement.querySelectorAll(selector)]\n\n if (this.$headings.length < 1) {\n return this\n }\n\n this.chapters = getChapters(\n this.$headings,\n showCode,\n this.attr('chapterTextFilter')\n )\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n getChapters(isTreeStructured = false) {\n const chapters = this.chapters\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\n }\n\n count() {\n return this.chapters.length\n }\n\n render() {\n const mounted = this.attr('mounted')\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const $headings = this.$headings\n const chapters = this.getChapters()\n\n paint()\n\n $headings.forEach(($heading, i) => {\n const chapterCode = chapters[i].code\n _updateHeading($heading, i, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n destroy() {\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n onAnchorTrigger(evt) {\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const $heading = $anchor.parentNode\n const top = offsetTop($heading) - (stickyHeight + 10)\n const $scrollElement = this.$scrollElement\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'anchor')\n }\n\n later(() => {\n publish('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.scrollTo(top, after)\n\n if (!anchorURL) {\n stop(evt)\n }\n\n return this\n }\n\n addListeners() {\n const $articleElement = this.$articleElement\n\n on(\n $articleElement,\n '.outline-heading__anchor',\n 'click',\n this.onAnchorTrigger,\n this,\n true\n )\n\n return this\n }\n\n removeListeners() {\n const $articleElement = this.$articleElement\n\n off($articleElement, 'click', this.onAnchorTrigger)\n\n return this\n }\n}\n\nAnchors.DEFAULTS = {\n scrollElement: 'html,body',\n articleElement: '#article',\n selector: 'h1,h2,h3,h4,h5,h6',\n stickyHeight: 0,\n anchorURL: '',\n hasAnchor: true,\n isAtStart: true,\n showCode: false,\n created: null,\n mounted: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n chapterTextFilter: null\n}\n\nexport default Anchors\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n const $scrollElement = _getScrollElement(scrollElement)\n let scrollTop = $scrollElement.scrollTop\n let step = 0\n const distance = top - scrollTop\n const MAX_HEIGHT = $scrollElement.scrollHeight\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n const stop = (top) => {\n if (isFunction(afterStop)) {\n afterStop(top)\n }\n\n return false\n }\n const play = () => {\n step += 1\n\n // 向上滚动\n if (distance < 0) {\n scrollTop -= easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop <= top) {\n $scrollElement.scrollTop = top\n return stop(top)\n }\n } else {\n scrollTop += easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop >= MAX_TOP) {\n $scrollElement.scrollTop = MAX_TOP\n return stop(MAX_TOP)\n }\n }\n\n requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","offsetTop","el","top","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","fn","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","setTimeout","isArray","Array","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","exec","iconName","getSymbol","paint","$body","body","$icons","symbols","add","innerHTML","join","createElement","insertBefore","firstChild","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","className","isSVG","pattern","RegExp","test","icon","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","_updateHeading","$heading","$fragment","createDocumentFragment","CLS_HEADING","hasAnchor","isAtStart","showCode","chapterCode","anchorURL","headingId","id","text","$anchor","children","$el","isValidChild","child","append","createTextNode","appendChild","every","href","removeClass","classList","allClass","contains","hasClass","remove","_resetHeading","removeAttribute","removeChild","getChapters","headings","chapterTextFilter","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","scrollTo","after","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","delay","later","publish","min","stopPropagation","preventDefault"],"mappings":"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"} \ No newline at end of file diff --git a/chapters.min.js b/chapters.min.js index 40b8b477..4c6c31a3 100644 --- a/chapters.min.js +++ b/chapters.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chapters=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),r=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class l{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const l=this.attrs;return t(s)?i&&e(l,s)?(l[s]=i,this):l[s]:r(s)?(n=l,o=s,Object.keys(o).forEach((t=>{e(o,t)&&(n[t]=o[t])})),this):0===arguments.length?l:this;var n,o}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const n=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),o=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),a=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],c=(t,e,s)=>{const i=a.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},h=function(e,s,i=!1){const r=t(e)?document.querySelector(e):e,l=r.childNodes,o=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(r,s);o.forEach((t=>{c(r,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&r&&l&&l.forEach((t=>{n(t)&&h(t,s,i)}))},u=(t,e,s)=>{if(!i(s))return h(t,e);c(t,e,s)},d=(t,e,s,r,l,n=!1)=>{const o=a.indexOf(e)>-1,c=function(i){let o=l||t;!0===l&&(o=r),!0===n&&u(t,e,c),s.call(o,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:c,data:r,context:l,capture:o}),s._delegateListener=c,t.addEventListener(e,c,o)},p=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},m=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,f=(t,e,s,i,r,l,n=!1)=>{const o=a.indexOf(s)>-1,c=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),h=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&p(t,e):p(t,e))||i&&t===r)return t;if(t===r)break}while(t=m(t))})(a,e,t);let d=l||t;o.delegateTarget=h,!0===l&&(d=r),h&&(!0===n&&u(t,s,c),i.call(d,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:c,data:r,context:l,capture:o}),i._delegateListener=c,t.addEventListener(s,c,o)},y=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),g=t=>{return!(!r(t)||!(n(t)||(t=>!(!r(t)||"[object NodeList]"!==s(t)))(t)||(e=t,r(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!r(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},$=(s,i,l)=>{const n=document.createDocumentFragment(),o=document.createElement(s),a=e=>g(e)||t(e),c=e=>{let s;if(!a(e))return!1;g(e)?s=e:t(e)&&(s=document.createTextNode(e)),n.appendChild(s)};return r(i)?Object.keys(i).forEach((t=>{e(i,t)&&((t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}})(o,t,i[t])})):y(i)&&i.every((t=>a(t)))&&i.forEach((t=>{c(t)})),y(l)?l.forEach((t=>{c(t)})):c(l),o.appendChild(n),o},b=t=>t*t,T=(e=null)=>{let s,i;return e?t(e)?i=document.querySelector(e):n(e)&&(i=e):(s=document.querySelectorAll("html,body"),i=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),i},v=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!n(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},_=(t,e)=>{let s,i;if(v(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},E=(e,s)=>{let i,r=e.className;if(!r||!v(e,s))return!1;var l;i=e.classList,i?.remove?i.remove(s):(l=r.replace(s,""),r=!!t(l)&&l.replace(/(^\s+)|(\s+$)/g,""),e.className=r)},x=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=x(t.offsetParent)),e},S=(t,e)=>getComputedStyle(t)[e],A=(t,e)=>{document.documentElement.style.setProperty(t,e)},N={},k=t=>e(N,t)&&N[t].length>0,j=(t,e=!0)=>e?k(t):(t=>{let e=k(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=k(t);return e})(t),L=(t,e,i=!0)=>{const r=t=>{if(!k(t))return!1;N[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},l=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),r(e);r(t),r("*")};if(!j(t))return!1;i?setTimeout(l,10):l()};class O extends l{constructor(t){super(),this.attrs=O.DEFAULTS,this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.closed=!1,this.active=0,this.offsetTop=0,this.offsetWidth=0,this.$active=null,this.scrollTimer=null,this.resizeTimer=null,this.playing=!1,this.Observer=null,t&&this.initialize(t)}initialize(e){let s,r,l,o;return this.attr(e),s=this.attr("created"),r=this.attr("parentElement"),l=this.attr("scrollElement"),t(r)?o=document.querySelector(r):n(r)&&(o=r),this.$parentElement=o,this.$scrollElement=T(l),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),s=this.attr("customClass"),i=this.$parentElement,r=[];let l,n,o,a,c=null;return i?(this.isInside()&&e&&(c=$("h2",{className:"outline-chapters__title"},[e]),this.$title=c,r.push(c)),o=$("ul",{className:"outline-chapters__list"},[""]),this.$list=o,a=$("div",{className:"outline-chapters__placeholder"},[""]),this.$placeholder=a,n=$("div",{className:"outline-chapters__main"},[o,a]),this.$main=n,r.push(n),l=$("nav",{id:"outline-chapters",className:"outline-chapters outline-chapters_hidden"},r),this.$el=l,this.isSticky()&&(this.calculateStickyHeight(),_(l,"outline-chapters_sticky")),s&&_(l,s),t.appendChild(l),i.appendChild(t),this):this}render(){const t=this.attr("showCode"),e=this.attr("mounted"),s=this.$parentElement,r=this.chapters;let l,n;return!s||r.length<1||(console.time("chapters"),this._paintEdge(),l=this.$el,n=this.$list,((t,e,s=!1)=>{const i=t=>document.querySelector(`#${t}`);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=$("span",{className:"outline-chapters__text"},[e.text]),a=$("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},[o]);let c,h,u,d;s&&(c=$("span",{className:"outline-chapters__code","data-id":l},[e.code]),a.insertBefore(c,a.firstChild)),h=$("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},[a]),-1===r?t.appendChild(h):(d=i(`chapter-${r}`),u=i(`subject-${r}`),u?u.appendChild(h):(u=$("ul",{id:"subject-"+r,className:"outline-chapters__subject"},[h]),d.appendChild(u)))}))})(n,r,t),E(l,"outline-chapters_hidden"),this.positionPlaceholder(this.active),console.timeEnd("chapters"),this.offsetTop=x(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),A("--outline-chapters-width",`${this.offsetWidth}px`)),i(e)&&e.call(this),this.onObserver()),this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=parseInt(S(e,"padding-top"),10),n=parseInt(S(e,"border-top-width"),10),o=parseInt(S(s,"padding-top"),10),a=parseInt(S(s,"margin-top"),10),c=parseInt(S(s,"border-top-width"),10);let h,u=r.offsetHeight,d=0;return l&&(d+=l),o&&(d+=o),a&&(d+=a),n&&(d+=n),c&&(d+=c),h=u*t,i.style.cssText=`transform: translateY(${d+h}px);height:${u}px;`,this}highlight(t){const e=this.$el.querySelector(`#chapter__anchor-${t}`),s="outline-chapters_active";return e?(this.$active&&E(this.$active,s),this.active=parseInt(e.getAttribute("data-id"),10),this.$active=e,_(this.$active,s),this.positionPlaceholder(this.active),this):this}sticky(){const t=this.attr("afterSticky"),e="outline-chapters_fixed",s=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?_(s,e):E(s,e),i(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return A("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){return((t,e,s)=>{const r=T(t);let l=r.scrollTop,n=0;const o=e-l,a=r.scrollHeight,c=e-a<=0?e:a,h=t=>(i(s)&&s(t),!1),u=()=>{if(n+=1,o<0){if(l-=b(n),r.scrollTop=l,l<=e)return r.scrollTop=e,h(e)}else if(l+=b(n),r.scrollTop=l,l>=c)return r.scrollTop=c,h(c);requestAnimationFrame(u)};requestAnimationFrame(u)})(this.$scrollElement,t,e),this}show(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterOpened"),r=this.$el,l=this.$parentElement;return this.isInside()?(E(l,e),E(r,e),o((()=>{E(l,t),E(r,t)}),30)):E(r,e),this.closed=!1,i(s)&&s.call(this),this}hide(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterClosed"),r=this.$el,l=this.$parentElement;return this.isInside()?(_(l,t),_(r,t),o((()=>{_(l,e),_(r,e)}))):_(r,e),this.closed=!0,i(s)&&s.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&o((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(O.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.active=0,this.offsetTop=0,this.$active=null,this.closed=!1,this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),i(e)&&e.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let e=null;return this.Observer=((t,e={})=>{const s=e.root||null,r=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},a=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),c=n(s)?s:document;return s&&(o.root=s),c.querySelectorAll(r).forEach((t=>{a.observe(t)})),a})((t=>{const s=t.getAttribute("data-id");if(this.playing)return!1;e&&clearTimeout(e),e=o((()=>{this.highlight(s)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),l=s.href.split("#")[1],n=document.querySelector(`#${l}`),a=x(n)-(e+10),c=this.$scrollElement.scrollHeight,h=this.attr("afterScroll"),u=()=>{i(h)&&h.call(this,"chapter"),o((()=>{this.playing=!1,L("toolbar:update",{top:a,min:0,max:c})}))};return this.playing=!0,this.isFixed()?(this.sticky(),o((()=>{this.scrollTo(a,u),this.highlight(r)}),10)):(this.scrollTo(a,u),this.highlight(r)),function(t){t.stopPropagation(),t.preventDefault()}(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=o((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),L("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=o((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),f(t,".outline-chapters__anchor","click",this.onSelect,this,!0),d(i,"scroll",this.onScroll,this,!0),this.isSticky()&&d(i,"resize",this.onResize,this,!0),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),u(e,"click",this.onSelect),u(r,"scroll",this.onScroll),this.isSticky()&&d(r,"resize",this.onResize),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}return O.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null},O})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chapters=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),r=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class l{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const l=this.attrs;return t(s)?i&&e(l,s)?(l[s]=i,this):l[s]:r(s)?(n=l,o=s,Object.keys(o).forEach((t=>{e(o,t)&&(n[t]=o[t])})),this):0===arguments.length?l:this;var n,o}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const n=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),o=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),a=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],c=(t,e,s)=>{const i=a.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},h=function(e,s,i=!1){const r=t(e)?document.querySelector(e):e,l=r.childNodes,o=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(r,s);o.forEach((t=>{c(r,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&r&&l&&l.forEach((t=>{n(t)&&h(t,s,i)}))},u=(t,e,s)=>{if(!i(s))return h(t,e);c(t,e,s)},d=(t,e,s,r,l,n=!1)=>{const o=a.indexOf(e)>-1,c=function(i){let o=l||t;!0===l&&(o=r),!0===n&&u(t,e,c),s.call(o,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:c,data:r,context:l,capture:o}),s._delegateListener=c,t.addEventListener(e,c,o)},p=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},m=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,f=(t,e,s,i,r,l,n=!1)=>{const o=a.indexOf(s)>-1,c=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),h=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&p(t,e):p(t,e))||i&&t===r)return t;if(t===r)break}while(t=m(t))})(a,e,t);let d=l||t;o.delegateTarget=h,!0===l&&(d=r),h&&(!0===n&&u(t,s,c),i.call(d,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:c,data:r,context:l,capture:o}),i._delegateListener=c,t.addEventListener(s,c,o)},y=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),g=t=>{return!(!r(t)||!(n(t)||(t=>!(!r(t)||"[object NodeList]"!==s(t)))(t)||(e=t,r(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!r(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},$=(s,i,l)=>{const n=document.createDocumentFragment(),o=document.createElement(s),a=e=>g(e)||t(e),c=e=>{let s;if(!a(e))return!1;g(e)?s=e:t(e)&&(s=document.createTextNode(e)),n.appendChild(s)};return r(i)?Object.keys(i).forEach((t=>{e(i,t)&&((t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}})(o,t,i[t])})):y(i)&&i.every((t=>a(t)))&&i.forEach((t=>{c(t)})),y(l)?l.forEach((t=>{c(t)})):c(l),o.appendChild(n),o},b=t=>t*t,T=(e=null)=>{let s,i;return e?t(e)?i=document.querySelector(e):n(e)&&(i=e):(s=document.querySelectorAll("html,body"),i=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),i},v=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!n(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},_=(t,e)=>{let s,i;if(v(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},E=(e,s)=>{let i,r=e.className;if(!r||!v(e,s))return!1;var l;i=e.classList,i?.remove?i.remove(s):(l=r.replace(s,""),r=!!t(l)&&l.replace(/(^\s+)|(\s+$)/g,""),e.className=r)},x=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=x(t.offsetParent)),e},S=(t,e)=>getComputedStyle(t)[e],A=(t,e)=>{document.documentElement.style.setProperty(t,e)},N={},k=t=>e(N,t)&&N[t].length>0,j=(t,e=!0)=>e?k(t):(t=>{let e=k(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=k(t);return e})(t),L=(t,e,i=!0)=>{const r=t=>{if(!k(t))return!1;N[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},l=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),r(e);r(t),r("*")};if(!j(t))return!1;i?setTimeout(l,10):l()};class O extends l{constructor(t){super(),this.attrs=O.DEFAULTS,this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.closed=!1,this.active=0,this.offsetTop=0,this.offsetWidth=0,this.$active=null,this.scrollTimer=null,this.resizeTimer=null,this.playing=!1,this.Observer=null,t&&this.initialize(t)}initialize(e){let s,r,l,o;return this.attr(e),s=this.attr("created"),r=this.attr("parentElement"),l=this.attr("scrollElement"),t(r)?o=document.querySelector(r):n(r)&&(o=r),this.$parentElement=o,this.$scrollElement=T(l),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),s=this.attr("customClass"),i=this.$parentElement,r=[];let l,n,o,a,c=null;return i?(this.isInside()&&e&&(c=$("h2",{className:"outline-chapters__title"},[e]),this.$title=c,r.push(c)),o=$("ul",{className:"outline-chapters__list"},[""]),this.$list=o,a=$("div",{className:"outline-chapters__placeholder"},[""]),this.$placeholder=a,n=$("div",{className:"outline-chapters__main"},[o,a]),this.$main=n,r.push(n),l=$("nav",{id:"outline-chapters",className:"outline-chapters outline-chapters_hidden"},r),this.$el=l,this.isSticky()&&(this.calculateStickyHeight(),_(l,"outline-chapters_sticky")),s&&_(l,s),t.appendChild(l),i.appendChild(t),this):this}render(){const t=this.attr("showCode"),e=this.attr("mounted"),s=this.$parentElement,r=this.chapters;let l,n;return!s||r.length<1||(this._paintEdge(),l=this.$el,n=this.$list,((t,e,s=!1)=>{const i=t=>document.querySelector(`#${t}`);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=$("span",{className:"outline-chapters__text"},[e.text]),a=$("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},[o]);let c,h,u,d;s&&(c=$("span",{className:"outline-chapters__code","data-id":l},[e.code]),a.insertBefore(c,a.firstChild)),h=$("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},[a]),-1===r?t.appendChild(h):(d=i(`chapter-${r}`),u=i(`subject-${r}`),u?u.appendChild(h):(u=$("ul",{id:"subject-"+r,className:"outline-chapters__subject"},[h]),d.appendChild(u)))}))})(n,r,t),E(l,"outline-chapters_hidden"),this.positionPlaceholder(this.active),this.offsetTop=x(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),A("--outline-chapters-width",`${this.offsetWidth}px`)),i(e)&&e.call(this),this.onObserver()),this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=parseInt(S(e,"padding-top"),10),n=parseInt(S(e,"border-top-width"),10),o=parseInt(S(s,"padding-top"),10),a=parseInt(S(s,"margin-top"),10),c=parseInt(S(s,"border-top-width"),10);let h,u=r.offsetHeight,d=0;return l&&(d+=l),o&&(d+=o),a&&(d+=a),n&&(d+=n),c&&(d+=c),h=u*t,i.style.cssText=`transform: translateY(${d+h}px);height:${u}px;`,this}highlight(t){const e=this.$el.querySelector(`#chapter__anchor-${t}`),s="outline-chapters_active";return e?(this.$active&&E(this.$active,s),this.active=parseInt(e.getAttribute("data-id"),10),this.$active=e,_(this.$active,s),this.positionPlaceholder(this.active),this):this}sticky(){const t=this.attr("afterSticky"),e="outline-chapters_fixed",s=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?_(s,e):E(s,e),i(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return A("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){return((t,e,s)=>{const r=T(t);let l=r.scrollTop,n=0;const o=e-l,a=r.scrollHeight,c=e-a<=0?e:a,h=t=>(i(s)&&s(t),!1),u=()=>{if(n+=1,o<0){if(l-=b(n),r.scrollTop=l,l<=e)return r.scrollTop=e,h(e)}else if(l+=b(n),r.scrollTop=l,l>=c)return r.scrollTop=c,h(c);requestAnimationFrame(u)};requestAnimationFrame(u)})(this.$scrollElement,t,e),this}show(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterOpened"),r=this.$el,l=this.$parentElement;return this.isInside()?(E(l,e),E(r,e),o((()=>{E(l,t),E(r,t)}),30)):E(r,e),this.closed=!1,i(s)&&s.call(this),this}hide(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterClosed"),r=this.$el,l=this.$parentElement;return this.isInside()?(_(l,t),_(r,t),o((()=>{_(l,e),_(r,e)}))):_(r,e),this.closed=!0,i(s)&&s.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&o((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(O.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.active=0,this.offsetTop=0,this.$active=null,this.closed=!1,this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),i(e)&&e.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let e=null;return this.Observer=((t,e={})=>{const s=e.root||null,r=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},a=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),c=n(s)?s:document;return s&&(o.root=s),c.querySelectorAll(r).forEach((t=>{a.observe(t)})),a})((t=>{const s=t.getAttribute("data-id");if(this.playing)return!1;e&&clearTimeout(e),e=o((()=>{this.highlight(s)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),l=s.href.split("#")[1],n=document.querySelector(`#${l}`),a=x(n)-(e+10),c=this.$scrollElement.scrollHeight,h=this.attr("afterScroll"),u=()=>{i(h)&&h.call(this,"chapter"),o((()=>{this.playing=!1,L("toolbar:update",{top:a,min:0,max:c})}))};return this.playing=!0,this.isFixed()?(this.sticky(),o((()=>{this.scrollTo(a,u),this.highlight(r)}),10)):(this.scrollTo(a,u),this.highlight(r)),function(t){t.stopPropagation(),t.preventDefault()}(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=o((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),L("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=o((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),f(t,".outline-chapters__anchor","click",this.onSelect,this,!0),d(i,"scroll",this.onScroll,this,!0),this.isSticky()&&d(i,"resize",this.onResize,this,!0),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),u(e,"click",this.onSelect),u(r,"scroll",this.onScroll),this.isSticky()&&d(r,"resize",this.onResize),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}return O.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null},O})); //# sourceMappingURL=chapters.min.js.map diff --git a/chapters.min.js.map b/chapters.min.js.map index 5a2df8c6..61d3eea0 100644 --- a/chapters.min.js.map +++ b/chapters.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chapters.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/types/isElement.js","src/utils/lang/later.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/at.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/types/isArray.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/createElement.js","src/utils/dom/setAttribute.js","src/utils/lang/easeInQuad.js","src/utils/dom/_getScrollElement.js","src/utils/dom/hasClass.js","src/utils/dom/addClass.js","src/utils/dom/removeClass.js","src/utils/lang/trim.js","src/utils/dom/offsetTop.js","src/utils/dom/getStyle.js","src/utils/dom/setProperty.js","src/utils/observer/_subscribers.js","src/utils/observer/_hasDirectSubscribersFor.js","src/utils/observer/has.js","src/utils/observer/_hasSubscribers.js","src/utils/observer/emit.js","src/utils/types/isTypedArray.js","src/chapters.js","src/_paintChapters.js","src/utils/dom/scrollTo.js","src/utils/dom/intersection.js","src/utils/event/stop.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from '../types/isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import isFunction from '../types/isFunction'\nimport off from './off'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定事件\n * ========================================================================\n * @method at\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst at = (el, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n const listener = function (evt) {\n let overrideContext = context || el\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n\n if (!isFunction(fn)) {\n return false\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default at\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n let $rootElements\n let $scrollElement\n\n if (!scrollElement) {\n $rootElements = document.querySelectorAll('html,body')\n $scrollElement =\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n ? $rootElements[0]\n : $rootElements[1]\n } else {\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n }\n\n return $scrollElement\n}\n\nexport default _getScrollElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} data - (必须)数据对象\n * @param {Boolean} async - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport later from './utils/lang/later'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport createElement from './utils/dom/createElement'\nimport scrollTo from './utils/dom/scrollTo'\nimport addClass from './utils/dom/addClass'\nimport intersection from './utils/dom/intersection'\nimport removeClass from './utils/dom/removeClass'\nimport offsetTop from './utils/dom/offsetTop'\nimport getStyle from './utils/dom/getStyle'\nimport setProperty from './utils/dom/setProperty'\nimport publish from './utils/observer/emit'\n\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = Chapters.DEFAULTS\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.chapters = []\n this.closed = false\n this.active = 0\n this.offsetTop = 0\n this.offsetWidth = 0\n this.$active = null\n this.scrollTimer = null\n this.resizeTimer = null\n this.playing = false\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n let parentElement\n let scrollElement\n let $parent\n\n this.attr(options)\n created = this.attr('created')\n parentElement = this.attr('parentElement')\n scrollElement = this.attr('scrollElement')\n\n if (isString(parentElement)) {\n $parent = document.querySelector(parentElement)\n } else if (isElement(parentElement)) {\n $parent = parentElement\n }\n this.$parentElement = $parent\n this.$scrollElement = _getScrollElement(scrollElement)\n\n this.chapters = this.attr('chapters')\n this.closed = this.attr('closed')\n this.active = this.attr('active')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n if (this.chapters.length < 1) {\n return this\n }\n\n this.render().addListeners()\n\n this.$active = document.querySelector(`#chapter-${this.active}`)\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n isSticky() {\n const position = this.attr('position')\n return position === 'sticky'\n }\n\n isFixed() {\n const position = this.attr('position')\n return position === 'fixed'\n }\n\n isInside() {\n return this.isFixed() || this.isSticky()\n }\n\n isOutside() {\n return !this.isInside()\n }\n\n _paintEdge() {\n const $fragment = document.createDocumentFragment()\n const STICKY = 'outline-chapters_sticky'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\n const contents = []\n let $title = null\n let $el\n let $main\n let $list\n let $placeholder\n\n if (!$parentElement) {\n return this\n }\n\n if (this.isInside() && title) {\n $title = createElement(\n 'h2',\n {\n className: 'outline-chapters__title'\n },\n [title]\n )\n this.$title = $title\n contents.push($title)\n }\n\n $list = createElement(\n 'ul',\n {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list`\n },\n ['']\n )\n this.$list = $list\n\n $placeholder = createElement(\n 'div',\n {\n className: 'outline-chapters__placeholder'\n },\n ['']\n )\n this.$placeholder = $placeholder\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n [$list, $placeholder]\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: `outline-chapters ${HIDDEN}`\n },\n contents\n )\n this.$el = $el\n\n if (this.isSticky()) {\n this.calculateStickyHeight()\n addClass($el, STICKY)\n }\n\n if (customClass) {\n addClass($el, customClass)\n }\n $fragment.appendChild($el)\n $parentElement.appendChild($fragment)\n\n return this\n }\n\n render() {\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n const chapters = this.chapters\n let $el\n let $list\n\n if (!$parentElement || chapters.length < 1) {\n return this\n }\n\n console.time('chapters')\n this._paintEdge()\n\n $el = this.$el\n $list = this.$list\n _paintChapters($list, chapters, showCode)\n removeClass($el, HIDDEN)\n this.positionPlaceholder(this.active)\n console.timeEnd('chapters')\n\n this.offsetTop = offsetTop($el)\n this.offsetWidth = $el.offsetWidth\n\n if (this.isFixed()) {\n this.sticky()\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n this.onObserver()\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\n const placeholderBorderTop = parseInt(\n getStyle($list, 'border-top-width'),\n 10\n )\n let height = $anchor.offsetHeight\n let offsetTop = 0\n let top\n\n if (mainPaddingTop) {\n offsetTop += mainPaddingTop\n }\n\n if (placeholderPaddingTop) {\n offsetTop += placeholderPaddingTop\n }\n\n if (placeholderMarginTop) {\n offsetTop += placeholderMarginTop\n }\n\n if (mainBorderTop) {\n offsetTop += mainBorderTop\n }\n\n if (placeholderBorderTop) {\n offsetTop += placeholderBorderTop\n }\n\n top = height * index\n // top:calc(${offsetTop}px + ${top}px);\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const HIGHLIGHT = 'outline-chapters_active'\n\n if (!$anchor) {\n return this\n }\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n this.$active = $anchor\n addClass(this.$active, HIGHLIGHT)\n\n this.positionPlaceholder(this.active)\n\n return this\n }\n\n sticky() {\n const afterSticky = this.attr('afterSticky')\n const FIXED = 'outline-chapters_fixed'\n const $el = this.$el\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (!this.isFixed()) {\n return this\n }\n\n isStickying = scrollTop >= top\n\n if (isStickying) {\n addClass($el, FIXED)\n } else {\n removeClass($el, FIXED)\n }\n\n if (isFunction(afterSticky)) {\n afterSticky.call(this, this.isClosed(), isStickying)\n }\n\n return this\n }\n\n calculateStickyHeight() {\n const documentElement = document.documentElement\n const height = Math.max(\n documentElement.clientHeight || 0,\n window.innerHeight || 0\n )\n setProperty('--outline-sticky-height', `${height}px`)\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n show() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const opened = this.attr('afterOpened')\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n removeClass($parent, HIDDEN)\n removeClass($el, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n removeClass($el, FOLDED)\n }, 30)\n } else {\n removeClass($el, HIDDEN)\n }\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n\n return this\n }\n\n hide() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const closed = this.attr('afterClosed')\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n addClass($parent, FOLDED)\n addClass($el, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n addClass($el, HIDDEN)\n })\n } else {\n addClass($el, HIDDEN)\n }\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n isStickying = scrollTop >= top\n afterToggle.call(this, this.isClosed(), isStickying)\n })\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.$active = null\n this.closed = false\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n this.scrollTimer = null\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n this.resizeTimer = null\n }\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\n\n this.Observer = intersection(\n ($heading) => {\n const id = $heading.getAttribute('data-id')\n\n if (this.playing) {\n return false\n }\n\n if (timer) {\n clearTimeout(timer)\n }\n\n timer = later(() => {\n this.highlight(id)\n }, 100)\n },\n {\n selector,\n context: this\n }\n )\n\n return this\n }\n\n onSelect(evt) {\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const id = $anchor.getAttribute('data-id')\n const headingId = $anchor.href.split('#')[1]\n const $heading = document.querySelector(`#${headingId}`)\n const top = offsetTop($heading) - (stickyHeight + 10)\n const min = 0\n const max = this.$scrollElement.scrollHeight\n const afterScroll = this.attr('afterScroll')\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'chapter')\n }\n\n later(() => {\n this.playing = false\n publish('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.playing = true\n if (this.isFixed()) {\n this.sticky()\n later(() => {\n this.scrollTo(top, after)\n this.highlight(id)\n }, 10)\n } else {\n this.scrollTo(top, after)\n this.highlight(id)\n }\n\n stop(evt)\n\n return this\n }\n\n onScroll() {\n const $scrollElement = this.$scrollElement\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n }\n\n this.scrollTimer = later(() => {\n const top = $scrollElement.scrollTop\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n\n if (this.isFixed()) {\n this.sticky()\n }\n\n publish('toolbar:update', {\n top,\n min,\n max\n })\n }, 100)\n\n return this\n }\n\n onResize() {\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n }\n\n this.resizeTimer = later(() => {\n this.calculateStickyHeight()\n })\n\n return this\n }\n\n addListeners() {\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\n at($element, 'scroll', this.onScroll, this, true)\n if (this.isSticky()) {\n at($element, 'resize', this.onResize, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const selector = this.attr('selector')\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n off($el, 'click', this.onSelect)\n off($element, 'scroll', this.onScroll)\n\n if (this.isSticky()) {\n at($element, 'resize', this.onResize)\n }\n\n if (this.Observer) {\n document.querySelectorAll(selector).forEach((section) => {\n this.Observer.unobserve(section)\n })\n }\n\n return this\n }\n}\n\nChapters.DEFAULTS = {\n parentElement: '',\n scrollElement: '',\n selector: '.outline-heading',\n active: 0,\n closed: false,\n showCode: true,\n position: 'relative',\n stickyHeight: 0,\n chapters: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterSticky: null\n}\n\nexport default Chapters\n","import createElement from './utils/dom/createElement'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const byId = (id) => document.querySelector(`#${id}`)\n\n chapters.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n [chapter.text]\n )\n const $link = createElement(\n 'a',\n {\n id: `chapter__anchor-${id}`,\n className: 'outline-chapters__anchor',\n href: '#' + rel,\n rel: rel,\n 'data-id': id\n },\n [$text]\n )\n let $code\n let $li\n let $ul\n let $parent\n\n if (showCode) {\n $code = createElement(\n 'span',\n {\n className: 'outline-chapters__code',\n 'data-id': id\n },\n [chapter.code]\n )\n\n $link.insertBefore($code, $link.firstChild)\n }\n\n $li = createElement(\n 'li',\n {\n id: `chapter-${id}`,\n className: 'outline-chapters__item',\n 'data-id': id\n },\n [$link]\n )\n\n if (pid === -1) {\n $list.appendChild($li)\n } else {\n $parent = byId(`chapter-${pid}`)\n $ul = byId(`subject-${pid}`)\n\n if (!$ul) {\n $ul = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n [$li]\n )\n\n $parent.appendChild($ul)\n } else {\n $ul.appendChild($li)\n }\n }\n })\n}\n\nexport default _paintChapters\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n const $scrollElement = _getScrollElement(scrollElement)\n let scrollTop = $scrollElement.scrollTop\n let step = 0\n const distance = top - scrollTop\n const MAX_HEIGHT = $scrollElement.scrollHeight\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n const stop = (top) => {\n if (isFunction(afterStop)) {\n afterStop(top)\n }\n\n return false\n }\n const play = () => {\n step += 1\n\n // 向上滚动\n if (distance < 0) {\n scrollTop -= easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop <= top) {\n $scrollElement.scrollTop = top\n return stop(top)\n }\n } else {\n scrollTop += easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop >= MAX_TOP) {\n $scrollElement.scrollTop = MAX_TOP\n return stop(MAX_TOP)\n }\n }\n\n requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","import isFunction from '../types/isFunction'\nimport isElement from '../types/isElement'\n\n/**\n * 通用的 IntersectionObserver 观察者处理器\n * ========================================================================\n * @method intersection\n * @param {Function} fn\n * @param {Object} [props]\n * @param {Object|HTMLElement} [props.root]\n * @param {String} [props.selector]\n * @param {Object} [props.context]\n * @param {String} [props.attr]\n * @param {String} [props.rootMargin]\n */\nconst intersection = (fn, props = {}) => {\n const root = props.root || null\n const selector = props.selector || '.outline-heading'\n const context = props.context || null\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\n const options = {\n rootMargin: rootMargin\n }\n const Observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.intersectionRatio > 0) {\n if (isFunction(fn)) {\n fn.call(context || entry.target, entry.target)\n }\n }\n })\n }, options)\n const $root = isElement(root) ? root : document\n\n if (root) {\n options.root = root\n }\n\n $root.querySelectorAll(selector).forEach((section) => {\n Observer.observe(section)\n })\n\n return Observer\n}\n\nexport default intersection\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","CAPTURE_EVENTS","_off","el","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","document","querySelector","$children","childNodes","filter","getListeners","$child","off","at","data","context","once","evt","overrideContext","push","addEventListener","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","createElement","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","toLowerCase","style","cssText","setAttribute","className","every","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","querySelectorAll","scrollTop","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","add","removeClass","remove","offsetTop","top","offsetParent","getStyle","ruleName","getComputedStyle","setProperty","documentElement","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","Chapters","super","DEFAULTS","$title","$main","$list","$placeholder","$parentElement","chapters","closed","active","offsetWidth","$active","scrollTimer","resizeTimer","playing","Observer","created","parentElement","$parent","isClosed","isSticky","isFixed","isInside","isOutside","_paintEdge","title","customClass","contents","id","calculateStickyHeight","showCode","mounted","console","time","byId","chapter","pid","rel","$text","text","$link","href","$code","$li","$ul","code","insertBefore","firstChild","_paintChapters","positionPlaceholder","timeEnd","sticky","onObserver","$anchor","mainPaddingTop","parseInt","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","height","offsetHeight","highlight","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","Math","max","clientHeight","window","innerHeight","scrollTo","after","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","show","FOLDED","HIDDEN","opened","hide","toggle","afterToggle","beforeDestroy","afterDestroy","removeChild","clearTimeout","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","$heading","onSelect","stickyHeight","headingId","split","afterScroll","publish","min","stopPropagation","preventDefault","onScroll","onResize","unobserve","afterClosed","afterOpened"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"chapters.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/types/isElement.js","src/utils/lang/later.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/at.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/types/isArray.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/createElement.js","src/utils/dom/setAttribute.js","src/utils/lang/easeInQuad.js","src/utils/dom/_getScrollElement.js","src/utils/dom/hasClass.js","src/utils/dom/addClass.js","src/utils/dom/removeClass.js","src/utils/lang/trim.js","src/utils/dom/offsetTop.js","src/utils/dom/getStyle.js","src/utils/dom/setProperty.js","src/utils/observer/_subscribers.js","src/utils/observer/_hasDirectSubscribersFor.js","src/utils/observer/has.js","src/utils/observer/_hasSubscribers.js","src/utils/observer/emit.js","src/utils/types/isTypedArray.js","src/chapters.js","src/_paintChapters.js","src/utils/dom/scrollTo.js","src/utils/dom/intersection.js","src/utils/event/stop.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from '../types/isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import isFunction from '../types/isFunction'\nimport off from './off'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定事件\n * ========================================================================\n * @method at\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst at = (el, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n const listener = function (evt) {\n let overrideContext = context || el\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n\n if (!isFunction(fn)) {\n return false\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default at\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n let $rootElements\n let $scrollElement\n\n if (!scrollElement) {\n $rootElements = document.querySelectorAll('html,body')\n $scrollElement =\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n ? $rootElements[0]\n : $rootElements[1]\n } else {\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n }\n\n return $scrollElement\n}\n\nexport default _getScrollElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} data - (必须)数据对象\n * @param {Boolean} async - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport later from './utils/lang/later'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport createElement from './utils/dom/createElement'\nimport scrollTo from './utils/dom/scrollTo'\nimport addClass from './utils/dom/addClass'\nimport intersection from './utils/dom/intersection'\nimport removeClass from './utils/dom/removeClass'\nimport offsetTop from './utils/dom/offsetTop'\nimport getStyle from './utils/dom/getStyle'\nimport setProperty from './utils/dom/setProperty'\nimport publish from './utils/observer/emit'\n\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = Chapters.DEFAULTS\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.chapters = []\n this.closed = false\n this.active = 0\n this.offsetTop = 0\n this.offsetWidth = 0\n this.$active = null\n this.scrollTimer = null\n this.resizeTimer = null\n this.playing = false\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n let parentElement\n let scrollElement\n let $parent\n\n this.attr(options)\n created = this.attr('created')\n parentElement = this.attr('parentElement')\n scrollElement = this.attr('scrollElement')\n\n if (isString(parentElement)) {\n $parent = document.querySelector(parentElement)\n } else if (isElement(parentElement)) {\n $parent = parentElement\n }\n this.$parentElement = $parent\n this.$scrollElement = _getScrollElement(scrollElement)\n\n this.chapters = this.attr('chapters')\n this.closed = this.attr('closed')\n this.active = this.attr('active')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n if (this.chapters.length < 1) {\n return this\n }\n\n this.render().addListeners()\n\n this.$active = document.querySelector(`#chapter-${this.active}`)\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n isSticky() {\n const position = this.attr('position')\n return position === 'sticky'\n }\n\n isFixed() {\n const position = this.attr('position')\n return position === 'fixed'\n }\n\n isInside() {\n return this.isFixed() || this.isSticky()\n }\n\n isOutside() {\n return !this.isInside()\n }\n\n _paintEdge() {\n const $fragment = document.createDocumentFragment()\n const STICKY = 'outline-chapters_sticky'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\n const contents = []\n let $title = null\n let $el\n let $main\n let $list\n let $placeholder\n\n if (!$parentElement) {\n return this\n }\n\n if (this.isInside() && title) {\n $title = createElement(\n 'h2',\n {\n className: 'outline-chapters__title'\n },\n [title]\n )\n this.$title = $title\n contents.push($title)\n }\n\n $list = createElement(\n 'ul',\n {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list`\n },\n ['']\n )\n this.$list = $list\n\n $placeholder = createElement(\n 'div',\n {\n className: 'outline-chapters__placeholder'\n },\n ['']\n )\n this.$placeholder = $placeholder\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n [$list, $placeholder]\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: `outline-chapters ${HIDDEN}`\n },\n contents\n )\n this.$el = $el\n\n if (this.isSticky()) {\n this.calculateStickyHeight()\n addClass($el, STICKY)\n }\n\n if (customClass) {\n addClass($el, customClass)\n }\n $fragment.appendChild($el)\n $parentElement.appendChild($fragment)\n\n return this\n }\n\n render() {\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n const chapters = this.chapters\n let $el\n let $list\n\n if (!$parentElement || chapters.length < 1) {\n return this\n }\n\n this._paintEdge()\n\n $el = this.$el\n $list = this.$list\n _paintChapters($list, chapters, showCode)\n removeClass($el, HIDDEN)\n this.positionPlaceholder(this.active)\n\n this.offsetTop = offsetTop($el)\n this.offsetWidth = $el.offsetWidth\n\n if (this.isFixed()) {\n this.sticky()\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n this.onObserver()\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\n const placeholderBorderTop = parseInt(\n getStyle($list, 'border-top-width'),\n 10\n )\n let height = $anchor.offsetHeight\n let offsetTop = 0\n let top\n\n if (mainPaddingTop) {\n offsetTop += mainPaddingTop\n }\n\n if (placeholderPaddingTop) {\n offsetTop += placeholderPaddingTop\n }\n\n if (placeholderMarginTop) {\n offsetTop += placeholderMarginTop\n }\n\n if (mainBorderTop) {\n offsetTop += mainBorderTop\n }\n\n if (placeholderBorderTop) {\n offsetTop += placeholderBorderTop\n }\n\n top = height * index\n // top:calc(${offsetTop}px + ${top}px);\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const HIGHLIGHT = 'outline-chapters_active'\n\n if (!$anchor) {\n return this\n }\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n this.$active = $anchor\n addClass(this.$active, HIGHLIGHT)\n\n this.positionPlaceholder(this.active)\n\n return this\n }\n\n sticky() {\n const afterSticky = this.attr('afterSticky')\n const FIXED = 'outline-chapters_fixed'\n const $el = this.$el\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (!this.isFixed()) {\n return this\n }\n\n isStickying = scrollTop >= top\n\n if (isStickying) {\n addClass($el, FIXED)\n } else {\n removeClass($el, FIXED)\n }\n\n if (isFunction(afterSticky)) {\n afterSticky.call(this, this.isClosed(), isStickying)\n }\n\n return this\n }\n\n calculateStickyHeight() {\n const documentElement = document.documentElement\n const height = Math.max(\n documentElement.clientHeight || 0,\n window.innerHeight || 0\n )\n setProperty('--outline-sticky-height', `${height}px`)\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n show() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const opened = this.attr('afterOpened')\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n removeClass($parent, HIDDEN)\n removeClass($el, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n removeClass($el, FOLDED)\n }, 30)\n } else {\n removeClass($el, HIDDEN)\n }\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n\n return this\n }\n\n hide() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const closed = this.attr('afterClosed')\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n addClass($parent, FOLDED)\n addClass($el, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n addClass($el, HIDDEN)\n })\n } else {\n addClass($el, HIDDEN)\n }\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n isStickying = scrollTop >= top\n afterToggle.call(this, this.isClosed(), isStickying)\n })\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.$active = null\n this.closed = false\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n this.scrollTimer = null\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n this.resizeTimer = null\n }\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\n\n this.Observer = intersection(\n ($heading) => {\n const id = $heading.getAttribute('data-id')\n\n if (this.playing) {\n return false\n }\n\n if (timer) {\n clearTimeout(timer)\n }\n\n timer = later(() => {\n this.highlight(id)\n }, 100)\n },\n {\n selector,\n context: this\n }\n )\n\n return this\n }\n\n onSelect(evt) {\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const id = $anchor.getAttribute('data-id')\n const headingId = $anchor.href.split('#')[1]\n const $heading = document.querySelector(`#${headingId}`)\n const top = offsetTop($heading) - (stickyHeight + 10)\n const min = 0\n const max = this.$scrollElement.scrollHeight\n const afterScroll = this.attr('afterScroll')\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'chapter')\n }\n\n later(() => {\n this.playing = false\n publish('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.playing = true\n if (this.isFixed()) {\n this.sticky()\n later(() => {\n this.scrollTo(top, after)\n this.highlight(id)\n }, 10)\n } else {\n this.scrollTo(top, after)\n this.highlight(id)\n }\n\n stop(evt)\n\n return this\n }\n\n onScroll() {\n const $scrollElement = this.$scrollElement\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n }\n\n this.scrollTimer = later(() => {\n const top = $scrollElement.scrollTop\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n\n if (this.isFixed()) {\n this.sticky()\n }\n\n publish('toolbar:update', {\n top,\n min,\n max\n })\n }, 100)\n\n return this\n }\n\n onResize() {\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n }\n\n this.resizeTimer = later(() => {\n this.calculateStickyHeight()\n })\n\n return this\n }\n\n addListeners() {\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\n at($element, 'scroll', this.onScroll, this, true)\n if (this.isSticky()) {\n at($element, 'resize', this.onResize, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const selector = this.attr('selector')\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n off($el, 'click', this.onSelect)\n off($element, 'scroll', this.onScroll)\n\n if (this.isSticky()) {\n at($element, 'resize', this.onResize)\n }\n\n if (this.Observer) {\n document.querySelectorAll(selector).forEach((section) => {\n this.Observer.unobserve(section)\n })\n }\n\n return this\n }\n}\n\nChapters.DEFAULTS = {\n parentElement: '',\n scrollElement: '',\n selector: '.outline-heading',\n active: 0,\n closed: false,\n showCode: true,\n position: 'relative',\n stickyHeight: 0,\n chapters: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterSticky: null\n}\n\nexport default Chapters\n","import createElement from './utils/dom/createElement'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const byId = (id) => document.querySelector(`#${id}`)\n\n chapters.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n [chapter.text]\n )\n const $link = createElement(\n 'a',\n {\n id: `chapter__anchor-${id}`,\n className: 'outline-chapters__anchor',\n href: '#' + rel,\n rel: rel,\n 'data-id': id\n },\n [$text]\n )\n let $code\n let $li\n let $ul\n let $parent\n\n if (showCode) {\n $code = createElement(\n 'span',\n {\n className: 'outline-chapters__code',\n 'data-id': id\n },\n [chapter.code]\n )\n\n $link.insertBefore($code, $link.firstChild)\n }\n\n $li = createElement(\n 'li',\n {\n id: `chapter-${id}`,\n className: 'outline-chapters__item',\n 'data-id': id\n },\n [$link]\n )\n\n if (pid === -1) {\n $list.appendChild($li)\n } else {\n $parent = byId(`chapter-${pid}`)\n $ul = byId(`subject-${pid}`)\n\n if (!$ul) {\n $ul = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n [$li]\n )\n\n $parent.appendChild($ul)\n } else {\n $ul.appendChild($li)\n }\n }\n })\n}\n\nexport default _paintChapters\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n const $scrollElement = _getScrollElement(scrollElement)\n let scrollTop = $scrollElement.scrollTop\n let step = 0\n const distance = top - scrollTop\n const MAX_HEIGHT = $scrollElement.scrollHeight\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n const stop = (top) => {\n if (isFunction(afterStop)) {\n afterStop(top)\n }\n\n return false\n }\n const play = () => {\n step += 1\n\n // 向上滚动\n if (distance < 0) {\n scrollTop -= easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop <= top) {\n $scrollElement.scrollTop = top\n return stop(top)\n }\n } else {\n scrollTop += easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop >= MAX_TOP) {\n $scrollElement.scrollTop = MAX_TOP\n return stop(MAX_TOP)\n }\n }\n\n requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","import isFunction from '../types/isFunction'\nimport isElement from '../types/isElement'\n\n/**\n * 通用的 IntersectionObserver 观察者处理器\n * ========================================================================\n * @method intersection\n * @param {Function} fn\n * @param {Object} [props]\n * @param {Object|HTMLElement} [props.root]\n * @param {String} [props.selector]\n * @param {Object} [props.context]\n * @param {String} [props.attr]\n * @param {String} [props.rootMargin]\n */\nconst intersection = (fn, props = {}) => {\n const root = props.root || null\n const selector = props.selector || '.outline-heading'\n const context = props.context || null\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\n const options = {\n rootMargin: rootMargin\n }\n const Observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.intersectionRatio > 0) {\n if (isFunction(fn)) {\n fn.call(context || entry.target, entry.target)\n }\n }\n })\n }, options)\n const $root = isElement(root) ? root : document\n\n if (root) {\n options.root = root\n }\n\n $root.querySelectorAll(selector).forEach((section) => {\n Observer.observe(section)\n })\n\n return Observer\n}\n\nexport default intersection\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","CAPTURE_EVENTS","_off","el","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","document","querySelector","$children","childNodes","filter","getListeners","$child","off","at","data","context","once","evt","overrideContext","push","addEventListener","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","createElement","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","toLowerCase","style","cssText","setAttribute","className","every","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","querySelectorAll","scrollTop","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","add","removeClass","remove","offsetTop","top","offsetParent","getStyle","ruleName","getComputedStyle","setProperty","documentElement","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","Chapters","super","DEFAULTS","$title","$main","$list","$placeholder","$parentElement","chapters","closed","active","offsetWidth","$active","scrollTimer","resizeTimer","playing","Observer","created","parentElement","$parent","isClosed","isSticky","isFixed","isInside","isOutside","_paintEdge","title","customClass","contents","id","calculateStickyHeight","showCode","mounted","byId","chapter","pid","rel","$text","text","$link","href","$code","$li","$ul","code","insertBefore","firstChild","_paintChapters","positionPlaceholder","sticky","onObserver","$anchor","mainPaddingTop","parseInt","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","height","offsetHeight","highlight","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","Math","max","clientHeight","window","innerHeight","scrollTo","after","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","show","FOLDED","HIDDEN","opened","hide","toggle","afterToggle","beforeDestroy","afterDestroy","removeChild","clearTimeout","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","$heading","onSelect","stickyHeight","headingId","split","afterScroll","publish","min","stopPropagation","preventDefault","onScroll","onResize","unobserve","afterClosed","afterOpened"],"mappings":"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"} \ No newline at end of file diff --git a/docs/js/outline.min.js b/docs/js/outline.min.js index 3c20169a..33b1965a 100644 --- a/docs/js/outline.min.js +++ b/docs/js/outline.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Outline=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),r=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class l{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const l=this.attrs;return t(s)?i&&e(l,s)?(l[s]=i,this):l[s]:r(s)?(n=l,o=s,Object.keys(o).forEach((t=>{e(o,t)&&(n[t]=o[t])})),this):0===arguments.length?l:this;var n,o}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const n=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),o=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),h=t=>t*t,a=(e=null)=>{let s,i;return e?t(e)?i=document.querySelector(e):n(e)&&(i=e):(s=document.querySelectorAll("html,body"),i=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),i},c=(t,e,s)=>{const r=a(t);let l=r.scrollTop,n=0;const o=e-l,c=r.scrollHeight,d=e-c<=0?e:c,u=t=>(i(s)&&s(t),!1),p=()=>{if(n+=1,o<0){if(l-=h(n),r.scrollTop=l,l<=e)return r.scrollTop=e,u(e)}else if(l+=h(n),r.scrollTop=l,l>=d)return r.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)},d=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=d(t.offsetParent)),e},u=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},p=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,m=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],f=(t,e,s)=>{const i=m.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},g=function(e,s,i=!1){const r=t(e)?document.querySelector(e):e,l=r.childNodes,o=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(r,s);o.forEach((t=>{f(r,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&r&&l&&l.forEach((t=>{n(t)&&g(t,s,i)}))},b=(t,e,s)=>{if(!i(s))return g(t,e);f(t,e,s)},y=(t,e,s,i,r,l,n=!1)=>{const o=m.indexOf(s)>-1,h=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||i&&t===r)return t;if(t===r)break}while(t=p(t))})(a,e,t);let d=l||t;o.delegateTarget=c,!0===l&&(d=r),c&&(!0===n&&b(t,s,h),i.call(d,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},$=function(t){t.stopPropagation(),t.preventDefault()},v={},E=t=>e(v,t)&&v[t].length>0,_=(t,e=!0)=>e?E(t):(t=>{let e=E(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=E(t);return e})(t),T=(t,e,i=!0)=>{const r=t=>{if(!E(t))return!1;v[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},l=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),r(e);r(t),r("*")};if(!_(t))return!1;i?setTimeout(l,10):l()},w=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),S=['','','','','','','','',''],x=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return S.find((r=>{const l=s.exec(r)[1];return i.exec(l)[1]===e&&l===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):[...S],L=(e="")=>{const s=document.body;let i=document.querySelector("#outline-icons"),r=[];(e=>{if(!e)return!1;w(e)&&e.length>0?e.forEach((e=>{-1===S.indexOf(e)&&t(e)&&S.push(e)})):t(e)&&S.push(e)})(e),r=x(),i?i.innerHTML=r.join(""):(i=document.createElement("div"),i.innerHTML=``,s.insertBefore(i.firstChild,s.firstChild))},C=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),z=t=>{return!(!r(t)||!(n(t)||(t=>!(!r(t)||"[object NodeList]"!==s(t)))(t)||(e=t,r(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!r(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},k=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}},A=(s,i,l)=>{const n=document.createDocumentFragment(),o=document.createElement(s),h=e=>z(e)||t(e),a=e=>{let s;if(!h(e))return!1;z(e)?s=e:t(e)&&(s=document.createTextNode(e)),n.appendChild(s)};return r(i)?Object.keys(i).forEach((t=>{e(i,t)&&k(o,t,i[t])})):w(i)&&i.every((t=>h(t)))&&i.forEach((t=>{a(t)})),w(l)?l.forEach((t=>{a(t)})):a(l),o.appendChild(n),o},N=e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)},M=(e,s={})=>((e,s={})=>{const i=s.size||0,r=s.color||"",l=s.iconSet||"",n=w(i)?i[0]:i,o=w(i)?i[1]:i,h=i?`width:${n}px;height:${o}px;`:"",a=r?h+`color:${r}`:h,c=document.createElement("i");let d,u="",p="";return t(e)?(N(e)?p=e:(u=l&&"icon"!==l?`xlink:href="#${l}-icon-${e}"`:`xlink:href="#icon-${e}"`,p=``),c.className="outline-icon",c.innerHTML=p,N(e)&&(d=c.querySelector("svg"),d.setAttribute("aria-hidden","true"),d.setAttribute("xmlns","http://www.w3.org/2000/svg"),d.setAttribute("class","outline-icon__svg"),d.setAttribute("width","200"),d.setAttribute("height","200"),d.style=a),c):null})(e,s),H=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!n(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},O=(t,e)=>{let s,i=t.className;if(!i||!H(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=C(i.replace(e,"")),t.className=i)},D=(e,s=!0,i=!0)=>{const r="outline-heading",l=e.innerHTML;let n;if(e.innerHTML=l.replace(/^\d+(\.?\d+)*\s?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),O(e,r),!s)return!1;var o;n=e.querySelector(`.${r}__anchor`),i&&O(e,`${r}_start`),o=C(e.className),t(o)&&""===o&&e.removeAttribute("class"),e.removeChild(n)},F=(e,s=!0,r=null)=>{let l=1,n=0,o="";const h=[];return e.forEach(((e,s)=>{const a=e.tagName,c=a.replace(/h/i,"");let d=parseInt(c,10),u=-1;var p;d>l?(n+=1,u=1===n?-1:s-1):d===l||dn?1===d?(n=1,u=-1):u=h[s-1].pid:d<=n&&(1===d?n=1:(n-=l-d,n<=1&&(n=1)),u=1===n?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"",i(r)&&(o=r(o)),h.push({id:s,pid:u,level:n,rel:`heading-${s}`,text:o,tagName:a})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const s=e[`[${t.id}]`];if(!s||!w(s))return!1;s.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(h):h};class j extends l{constructor(t){super(),this.attrs=j.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){const s=this.attr("showCode")||!0;let r,l,o,h,c;return this.attr(e),c=this.attr("articleElement"),l=this.attr("scrollElement"),o=this.attr("selector"),r=this.attr("created"),t(c)?h=document.querySelector(c):n(c)&&(h=c),h?(this.$articleElement=h,this.$scrollElement=a(l),this.$headings=[...h.querySelectorAll(o)],this.$headings.length<1||(this.chapters=F(this.$headings,s,this.attr("chapterTextFilter")),i(r)&&r.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),s=this.attr("isAtStart"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.$headings,o=this.getChapters();return L(),n.forEach(((t,i)=>{const n=o[i].code;((t,e,s)=>{const i=document.createDocumentFragment(),r="outline-heading",l=s.hasAnchor||!0,n=s.isAtStart||!0,o=s.showCode||!1,h=s.chapterCode||"",a=s.anchorURL||"",c=`heading-${e}`,d={id:c,className:n?`${r} ${r}_start`:r,"data-id":e},u=Object.keys(d),p=C(t.innerHTML);let m,f;if(u.forEach((e=>{k(t,e,d[e])})),o&&(t.innerHTML=h+" "+p),!l)return!1;f=M("hash",{iconSet:"outline"}),m=A("a",{id:`anchor-${e}`,className:`${r}__anchor anchor-${e}`,href:a||`#${c}`,target:a?"_blank":"self","data-id":e},[f]),i.appendChild(m),t.appendChild(i)})(t,i,{hasAnchor:e,isAtStart:s,showCode:r,chapterCode:n,anchorURL:l})})),i(t)&&t.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),s=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return i(s)&&s.call(this),this.removeListeners(),l.forEach((s=>{D(s,t,e)})),this.attr(j.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],i(r)&&r.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),s=this.attr("afterScroll"),r=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,n=d(l)-(r+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(n,(()=>{i(s)&&s.call(this,"anchor"),o((()=>{T("toolbar:update",{top:n,min:0,max:a})}))})),e||$(t),this}addListeners(){const t=this.$articleElement;return y(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return b(t,"click",this.onAnchorTrigger),this}}j.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null};const U=(t,e)=>{let s,i;if(H(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},I=(t,e)=>{document.documentElement.style.setProperty(t,e)};let q=2e3;const B=t=>(t?q=t:q+=1,I("--outline-zIndex",`${q}`),q);class R extends l{constructor(t){super(),this.attrs=R.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),i(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),s=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),h=this.attr("autoHeight"),a=this.attr("customClass");let c,d,u,p,m,f,g,b;return L(),this.zIndex=B(),p=A("h2",{className:"outline-drawer__title"},[this.title]),this.$title=p,r&&(m=A("div",{className:"outline-drawer__close"},[M("close",{size:20})]),this.$close=m),u=A("header",{className:"outline-drawer__header"},[p,m]),this.$header=u,f=A("div",{className:"outline-drawer__main"},[""]),this.$main=f,o||U(f,"outline-drawer_full"),g=A("footer",{className:"outline-drawer__footer"},[""]),this.$footer=g,d=A("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${e} outline-drawer_closed`},[u,f,g]),this.$modal=d,n&&U(d,"outline-drawer_offset"),h&&U(d,"outline-drawer_auto"),a&&U(d,a),l&&(b=A("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=b),c=A("div",{className:"outline-drawer"},[d,b]),this.$el=c,document.body.appendChild(c),i(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return U(this.$el,"outline-drawer_opened"),O(e,"outline-drawer_closed"),U(e,"outline-drawer_opened"),o((()=>{this.closed=!1,i(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return O(e,"outline-drawer_opened"),U(e,"outline-drawer_closed"),o((()=>{O(this.$el,"outline-drawer_opened"),this.closed=!0,i(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),i(t)&&o((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let s=this.zIndex;return i(e)&&e.call(this),this.removeListeners(),this.attrs=R.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,B(s),this.zIndex=0,i(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&y(s,".outline-drawer__close","click",this.onClose,this,!0),e&&y(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(b(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}R.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const P=(t,e,s,r,l,n=!1)=>{const o=m.indexOf(e)>-1,h=function(i){let o=l||t;!0===l&&(o=r),!0===n&&b(t,e,h),s.call(o,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:h,data:r,context:l,capture:o}),s._delegateListener=h,t.addEventListener(e,h,o)},Q=(t,e)=>getComputedStyle(t)[e];class W extends l{constructor(t){super(),this.attrs=W.DEFAULTS,this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.closed=!1,this.active=0,this.offsetTop=0,this.offsetWidth=0,this.$active=null,this.scrollTimer=null,this.resizeTimer=null,this.playing=!1,this.Observer=null,t&&this.initialize(t)}initialize(e){let s,r,l,o;return this.attr(e),s=this.attr("created"),r=this.attr("parentElement"),l=this.attr("scrollElement"),t(r)?o=document.querySelector(r):n(r)&&(o=r),this.$parentElement=o,this.$scrollElement=a(l),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),s=this.attr("customClass"),i=this.$parentElement,r=[];let l,n,o,h,a=null;return i?(this.isInside()&&e&&(a=A("h2",{className:"outline-chapters__title"},[e]),this.$title=a,r.push(a)),o=A("ul",{className:"outline-chapters__list"},[""]),this.$list=o,h=A("div",{className:"outline-chapters__placeholder"},[""]),this.$placeholder=h,n=A("div",{className:"outline-chapters__main"},[o,h]),this.$main=n,r.push(n),l=A("nav",{id:"outline-chapters",className:"outline-chapters outline-chapters_hidden"},r),this.$el=l,this.isSticky()&&(this.calculateStickyHeight(),U(l,"outline-chapters_sticky")),s&&U(l,s),t.appendChild(l),i.appendChild(t),this):this}render(){const t=this.attr("showCode"),e=this.attr("mounted"),s=this.$parentElement,r=this.chapters;let l,n;return!s||r.length<1||(console.time("chapters"),this._paintEdge(),l=this.$el,n=this.$list,((t,e,s=!1)=>{const i=t=>document.querySelector(`#${t}`);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=A("span",{className:"outline-chapters__text"},[e.text]),h=A("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},[o]);let a,c,d,u;s&&(a=A("span",{className:"outline-chapters__code","data-id":l},[e.code]),h.insertBefore(a,h.firstChild)),c=A("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},[h]),-1===r?t.appendChild(c):(u=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(c):(d=A("ul",{id:"subject-"+r,className:"outline-chapters__subject"},[c]),u.appendChild(d)))}))})(n,r,t),O(l,"outline-chapters_hidden"),this.positionPlaceholder(this.active),console.timeEnd("chapters"),this.offsetTop=d(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),I("--outline-chapters-width",`${this.offsetWidth}px`)),i(e)&&e.call(this),this.onObserver()),this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=parseInt(Q(e,"padding-top"),10),n=parseInt(Q(e,"border-top-width"),10),o=parseInt(Q(s,"padding-top"),10),h=parseInt(Q(s,"margin-top"),10),a=parseInt(Q(s,"border-top-width"),10);let c,d=r.offsetHeight,u=0;return l&&(u+=l),o&&(u+=o),h&&(u+=h),n&&(u+=n),a&&(u+=a),c=d*t,i.style.cssText=`transform: translateY(${u+c}px);height:${d}px;`,this}highlight(t){const e=this.$el.querySelector(`#chapter__anchor-${t}`),s="outline-chapters_active";return e?(this.$active&&O(this.$active,s),this.active=parseInt(e.getAttribute("data-id"),10),this.$active=e,U(this.$active,s),this.positionPlaceholder(this.active),this):this}sticky(){const t=this.attr("afterSticky"),e="outline-chapters_fixed",s=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?U(s,e):O(s,e),i(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return I("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}show(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterOpened"),r=this.$el,l=this.$parentElement;return this.isInside()?(O(l,e),O(r,e),o((()=>{O(l,t),O(r,t)}),30)):O(r,e),this.closed=!1,i(s)&&s.call(this),this}hide(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterClosed"),r=this.$el,l=this.$parentElement;return this.isInside()?(U(l,t),U(r,t),o((()=>{U(l,e),U(r,e)}))):U(r,e),this.closed=!0,i(s)&&s.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&o((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(W.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.active=0,this.offsetTop=0,this.$active=null,this.closed=!1,this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),i(e)&&e.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let e=null;return this.Observer=((t,e={})=>{const s=e.root||null,r=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),a=n(s)?s:document;return s&&(o.root=s),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const s=t.getAttribute("data-id");if(this.playing)return!1;e&&clearTimeout(e),e=o((()=>{this.highlight(s)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),l=s.href.split("#")[1],n=document.querySelector(`#${l}`),h=d(n)-(e+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),o((()=>{this.playing=!1,T("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),o((()=>{this.scrollTo(h,u),this.highlight(r)}),10)):(this.scrollTo(h,u),this.highlight(r)),$(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=o((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),T("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=o((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),y(t,".outline-chapters__anchor","click",this.onSelect,this,!0),P(i,"scroll",this.onScroll,this,!0),this.isSticky()&&P(i,"resize",this.onResize,this,!0),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),b(e,"click",this.onSelect),b(r,"scroll",this.onScroll),this.isSticky()&&P(r,"resize",this.onResize),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}W.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const V=(t,e=!0)=>{const s=M(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=A("a",{className:"outline-toolbar__anchor",href:t.link},[s]),r=A("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return U(s,"outline-toolbar__icon"),e&&U(r,"outline-toolbar_rounded"),t.disabled&&U(r,"outline-toolbar_disabled"),r},J="outline-toolbar_disabled",Y="outline-toolbar_hidden";class G extends l{constructor(t){super(),this.attrs=G.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,H(i,s)?O(i,s):U(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),r=this.attr("placement"),l=document.createDocumentFragment(),n=document.createDocumentFragment();return L(),e.forEach((t=>{const e=V(t,s);l.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=A("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},[l]),n.appendChild(this.$el),document.body.appendChild(n),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),l=t.action,n=document.createDocumentFragment();let o;return r(t)?(s.push(t),n.appendChild(V(t))):w(t)&&t.forEach((t=>{n.appendChild(V(t))})),e.appendChild(n),l&&i(l.handler)&&(o=l.type||"click",y(e,`.${t.name}`,o,l.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,n,o,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(n=l.type||"click",o=l.handler),e?(O(h,J),n&&o&&y(s,`.${t}`,n,o)):(U(h,J),n&&o&&b(s,n,o)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(U(this.$el,J),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,O(this.$el,J),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),O(l,Y)}else O(r,Y),this.closed=!1,i(e)&&o((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),U(l,Y)}else U(r,Y),this.closed=!0,i(e)&&o((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(G.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(V(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const r=e.action;let l,n,o,h;if(this.disabled)return!1;r&&(n=r.handler,t(n)&&(h=n,r.handler=function(){T(h,e.name)},n=r.handler),l=r.type||"click",o=r.context),i(n)&&y(s,`.${e.name}`,l,n,o||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let r,l;if(this.disabled)return!1;s&&(l=s.handler,r=s.type||"click"),i(l)&&b(e,r,l)})),this}}G.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const K=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),X=(t,e,s=null)=>{const r=K();let l="symbol"==typeof t?t.toString():t;return i(e)?(v[l]||(v[l]=[]),v[l].push({topic:l,callback:e,context:s,token:r}),r):""},Z=t=>{if(!e(v,t))return!1;delete v[t]},tt=(t,e)=>{if(!_(t))return!1;e?(t=>{const e=Object.keys(v);if(!t||e.length<1)return!1;e.forEach((e=>{const s=v[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&Z(i)}))})(e):Z(t)};class et extends l{constructor(t){super(),this.attrs=et.DEFAULTS,this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,this.buttons=[],t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){const t=this.attr("scrollElement"),e=document.querySelector(t)||document.getElementById(t);return this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar(),e&&this.onToolbarUpdate({top:e.scrollTop,min:0,max:e.scrollHeight}),this}_renderPrint(){const e=this.attr("print"),s=this.attr("articleElement");let i;return e.element?(t(s)?i=document.querySelector(s):n(s)&&(i=s),U(i,"outline-article"),((e,s)=>{let i,r,l,h,a,c=s;t(e)?i=document.querySelector(e)||document.getElementById(e):n(e)&&(i=e),l=i.querySelector("h1"),n(s)&&(l=s),n(l)&&(c=l.innerText),r=A("article",{className:"outline-print"},[""]),r.innerHTML=i.innerHTML,l=A("h1",{className:"outline-print__title"},[c]),r.insertBefore(l,r.firstChild),document.body.appendChild(r),o((()=>{for(h=r.previousElementSibling;h;)a=h.tagName.toLowerCase(),"script"!==a&&"style"!==a&&U(h,"outline-print_sibling"),h=h.previousElementSibling;for(h=r.nextElementSibling;h;)a=h.tagName.toLowerCase(),"script"!==a&&"style"!==a&&U(h,"outline-print_sibling"),h=h.nextElementSibling}),350)})(e.element,e.title),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.attr("afterScroll"),o=this.attr("chapterTextFilter");return this.anchors=new j({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:n,chapterTextFilter:o}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("position"),n=this.attr("placement"),o=this.attr("afterSticky"),h=this.attr("afterToggle"),a=this.attr("afterScroll"),c=this.count();let d,u=this.attr("parentElement");return c<1||(d={scrollElement:s,showCode:r,position:l,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:o,afterToggle:h,afterScroll:a},"relative"===l?(this.drawer=new R({placement:n,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),u=this.drawer.$main):d.customClass=i,d.parentElement=u,this.chapters=new W(d)),this}_renderToolbar(){const t=this.attr("placement"),e=this.attr("homepage"),s=this.attr("git"),i=this.attr("tags"),r=this.attr("issues"),l=this.attr("tools"),n=this.count(),o={name:"homepage",icon:"homepage",size:20,link:e},h={name:"github",icon:"github",size:20,link:s},a={name:"tags",icon:"tags",size:20,link:i},c={name:"issues",icon:"issues",size:20,link:r},d={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},u=[];return u.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),n>0&&u.push(d),e&&u.push(o),s&&u.push(h),i&&u.push(a),r&&u.push(c),l?.length>0&&u.push(...l),u.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.buttons=[...u],this.toolbar=new G({placement:t,buttons:u}),this}addButton(t){const e=this.toolbar,s=this.buttons;return s.splice(-1,0,t),e.attr({buttons:s}),e.refresh(),this}removeButton(t){return this.toolbar.remove(t),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,s=this.chapters,r=this.count();return r>0&&(s.playing=!0),this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),r>0&&(s.highlight(0),s.playing=!1),i(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=a(this.attr("scrollElement")),s=this.toolbar,r=this.chapters,l=this.count(),n=Math.floor(e.scrollHeight-e.clientHeight);return l>0&&(r.playing=!0),this.scrollTo(n,(()=>{s.hide("down"),s.show("up"),l>0&&(r.highlight(l-1),r.playing=!1),i(t)&&t.call(s,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return c(s,t,e),this}toggle(){const t=this.attr("position"),e=this.toolbar,s=this.drawer,i=this.chapters;return this.count()<1||("relative"!==t?(i.toggle(),e.highlight("menu")):(e.toggle(),o((()=>{i.isInside()?i.toggle():s.toggle()})))),this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar,r=!1;const l=this.count();return this.removeListeners(),l>0&&(r=e.isOutside(),e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(et.DEFAULTS),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&r"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),r=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class l{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const l=this.attrs;return t(s)?i&&e(l,s)?(l[s]=i,this):l[s]:r(s)?(n=l,o=s,Object.keys(o).forEach((t=>{e(o,t)&&(n[t]=o[t])})),this):0===arguments.length?l:this;var n,o}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const n=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),o=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),h=t=>t*t,a=(e=null)=>{let s,i;return e?t(e)?i=document.querySelector(e):n(e)&&(i=e):(s=document.querySelectorAll("html,body"),i=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),i},c=(t,e,s)=>{const r=a(t);let l=r.scrollTop,n=0;const o=e-l,c=r.scrollHeight,d=e-c<=0?e:c,u=t=>(i(s)&&s(t),!1),p=()=>{if(n+=1,o<0){if(l-=h(n),r.scrollTop=l,l<=e)return r.scrollTop=e,u(e)}else if(l+=h(n),r.scrollTop=l,l>=d)return r.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)},d=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=d(t.offsetParent)),e},u=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},p=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,m=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],f=(t,e,s)=>{const i=m.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},g=function(e,s,i=!1){const r=t(e)?document.querySelector(e):e,l=r.childNodes,o=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(r,s);o.forEach((t=>{f(r,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&r&&l&&l.forEach((t=>{n(t)&&g(t,s,i)}))},b=(t,e,s)=>{if(!i(s))return g(t,e);f(t,e,s)},y=(t,e,s,i,r,l,n=!1)=>{const o=m.indexOf(s)>-1,h=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||i&&t===r)return t;if(t===r)break}while(t=p(t))})(a,e,t);let d=l||t;o.delegateTarget=c,!0===l&&(d=r),c&&(!0===n&&b(t,s,h),i.call(d,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},$=function(t){t.stopPropagation(),t.preventDefault()},v={},E=t=>e(v,t)&&v[t].length>0,_=(t,e=!0)=>e?E(t):(t=>{let e=E(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=E(t);return e})(t),T=(t,e,i=!0)=>{const r=t=>{if(!E(t))return!1;v[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},l=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),r(e);r(t),r("*")};if(!_(t))return!1;i?setTimeout(l,10):l()},w=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),S=['','','','','','','','',''],x=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return S.find((r=>{const l=s.exec(r)[1];return i.exec(l)[1]===e&&l===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):[...S],L=(e="")=>{const s=document.body;let i=document.querySelector("#outline-icons"),r=[];(e=>{if(!e)return!1;w(e)&&e.length>0?e.forEach((e=>{-1===S.indexOf(e)&&t(e)&&S.push(e)})):t(e)&&S.push(e)})(e),r=x(),i?i.innerHTML=r.join(""):(i=document.createElement("div"),i.innerHTML=``,s.insertBefore(i.firstChild,s.firstChild))},C=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),z=t=>{return!(!r(t)||!(n(t)||(t=>!(!r(t)||"[object NodeList]"!==s(t)))(t)||(e=t,r(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!r(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},k=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}},A=(s,i,l)=>{const n=document.createDocumentFragment(),o=document.createElement(s),h=e=>z(e)||t(e),a=e=>{let s;if(!h(e))return!1;z(e)?s=e:t(e)&&(s=document.createTextNode(e)),n.appendChild(s)};return r(i)?Object.keys(i).forEach((t=>{e(i,t)&&k(o,t,i[t])})):w(i)&&i.every((t=>h(t)))&&i.forEach((t=>{a(t)})),w(l)?l.forEach((t=>{a(t)})):a(l),o.appendChild(n),o},N=e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)},M=(e,s={})=>((e,s={})=>{const i=s.size||0,r=s.color||"",l=s.iconSet||"",n=w(i)?i[0]:i,o=w(i)?i[1]:i,h=i?`width:${n}px;height:${o}px;`:"",a=r?h+`color:${r}`:h,c=document.createElement("i");let d,u="",p="";return t(e)?(N(e)?p=e:(u=l&&"icon"!==l?`xlink:href="#${l}-icon-${e}"`:`xlink:href="#icon-${e}"`,p=``),c.className="outline-icon",c.innerHTML=p,N(e)&&(d=c.querySelector("svg"),d.setAttribute("aria-hidden","true"),d.setAttribute("xmlns","http://www.w3.org/2000/svg"),d.setAttribute("class","outline-icon__svg"),d.setAttribute("width","200"),d.setAttribute("height","200"),d.style.cssText=a),c):null})(e,s),H=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!n(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},O=(t,e)=>{let s,i=t.className;if(!i||!H(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=C(i.replace(e,"")),t.className=i)},D=(e,s=!0,i=!0)=>{const r="outline-heading",l=e.innerHTML;let n;if(e.innerHTML=l.replace(/^\d+(\.?\d+)*\s?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),O(e,r),!s)return!1;var o;n=e.querySelector(`.${r}__anchor`),i&&O(e,`${r}_start`),o=C(e.className),t(o)&&""===o&&e.removeAttribute("class"),e.removeChild(n)},F=(e,s=!0,r=null)=>{let l=1,n=0,o="";const h=[];return e.forEach(((e,s)=>{const a=e.tagName,c=a.replace(/h/i,"");let d=parseInt(c,10),u=-1;var p;d>l?(n+=1,u=1===n?-1:s-1):d===l||dn?1===d?(n=1,u=-1):u=h[s-1].pid:d<=n&&(1===d?n=1:(n-=l-d,n<=1&&(n=1)),u=1===n?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"",i(r)&&(o=r(o)),h.push({id:s,pid:u,level:n,rel:`heading-${s}`,text:o,tagName:a})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const s=e[`[${t.id}]`];if(!s||!w(s))return!1;s.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(h):h};class j extends l{constructor(t){super(),this.attrs=j.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){const s=this.attr("showCode")||!0;let r,l,o,h,c;return this.attr(e),c=this.attr("articleElement"),l=this.attr("scrollElement"),o=this.attr("selector"),r=this.attr("created"),t(c)?h=document.querySelector(c):n(c)&&(h=c),h?(this.$articleElement=h,this.$scrollElement=a(l),this.$headings=[...h.querySelectorAll(o)],this.$headings.length<1||(this.chapters=F(this.$headings,s,this.attr("chapterTextFilter")),i(r)&&r.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),s=this.attr("isAtStart"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.$headings,o=this.getChapters();return L(),n.forEach(((t,i)=>{const n=o[i].code;((t,e,s)=>{const i=document.createDocumentFragment(),r="outline-heading",l=s.hasAnchor||!0,n=s.isAtStart||!0,o=s.showCode||!1,h=s.chapterCode||"",a=s.anchorURL||"",c=`heading-${e}`,d={id:c,className:n?`${r} ${r}_start`:r,"data-id":e},u=Object.keys(d),p=C(t.innerHTML);let m,f;if(u.forEach((e=>{k(t,e,d[e])})),o&&(t.innerHTML=h+" "+p),!l)return!1;f=M("hash",{iconSet:"outline"}),m=A("a",{id:`anchor-${e}`,className:`${r}__anchor anchor-${e}`,href:a||`#${c}`,target:a?"_blank":"self","data-id":e},[f]),i.appendChild(m),t.appendChild(i)})(t,i,{hasAnchor:e,isAtStart:s,showCode:r,chapterCode:n,anchorURL:l})})),i(t)&&t.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),s=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return i(s)&&s.call(this),this.removeListeners(),l.forEach((s=>{D(s,t,e)})),this.attr(j.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],i(r)&&r.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),s=this.attr("afterScroll"),r=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,n=d(l)-(r+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(n,(()=>{i(s)&&s.call(this,"anchor"),o((()=>{T("toolbar:update",{top:n,min:0,max:a})}))})),e||$(t),this}addListeners(){const t=this.$articleElement;return y(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return b(t,"click",this.onAnchorTrigger),this}}j.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null};const U=(t,e)=>{let s,i;if(H(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},I=(t,e)=>{document.documentElement.style.setProperty(t,e)};let q=2e3;const B=t=>(t?q=t:q+=1,I("--outline-zIndex",`${q}`),q);class R extends l{constructor(t){super(),this.attrs=R.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),i(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),s=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),h=this.attr("autoHeight"),a=this.attr("customClass");let c,d,u,p,m,f,g,b;return L(),this.zIndex=B(),p=A("h2",{className:"outline-drawer__title"},[this.title]),this.$title=p,r&&(m=A("div",{className:"outline-drawer__close"},[M("close",{size:20})]),this.$close=m),u=A("header",{className:"outline-drawer__header"},[p,m]),this.$header=u,f=A("div",{className:"outline-drawer__main"},[""]),this.$main=f,o||U(f,"outline-drawer_full"),g=A("footer",{className:"outline-drawer__footer"},[""]),this.$footer=g,d=A("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${e} outline-drawer_closed`},[u,f,g]),this.$modal=d,n&&U(d,"outline-drawer_offset"),h&&U(d,"outline-drawer_auto"),a&&U(d,a),l&&(b=A("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=b),c=A("div",{className:"outline-drawer"},[d,b]),this.$el=c,document.body.appendChild(c),i(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return U(this.$el,"outline-drawer_opened"),O(e,"outline-drawer_closed"),U(e,"outline-drawer_opened"),o((()=>{this.closed=!1,i(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return O(e,"outline-drawer_opened"),U(e,"outline-drawer_closed"),o((()=>{O(this.$el,"outline-drawer_opened"),this.closed=!0,i(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),i(t)&&o((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let s=this.zIndex;return i(e)&&e.call(this),this.removeListeners(),this.attrs=R.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,B(s),this.zIndex=0,i(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&y(s,".outline-drawer__close","click",this.onClose,this,!0),e&&y(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(b(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}R.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const P=(t,e,s,r,l,n=!1)=>{const o=m.indexOf(e)>-1,h=function(i){let o=l||t;!0===l&&(o=r),!0===n&&b(t,e,h),s.call(o,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:h,data:r,context:l,capture:o}),s._delegateListener=h,t.addEventListener(e,h,o)},Q=(t,e)=>getComputedStyle(t)[e];class W extends l{constructor(t){super(),this.attrs=W.DEFAULTS,this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.closed=!1,this.active=0,this.offsetTop=0,this.offsetWidth=0,this.$active=null,this.scrollTimer=null,this.resizeTimer=null,this.playing=!1,this.Observer=null,t&&this.initialize(t)}initialize(e){let s,r,l,o;return this.attr(e),s=this.attr("created"),r=this.attr("parentElement"),l=this.attr("scrollElement"),t(r)?o=document.querySelector(r):n(r)&&(o=r),this.$parentElement=o,this.$scrollElement=a(l),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),s=this.attr("customClass"),i=this.$parentElement,r=[];let l,n,o,h,a=null;return i?(this.isInside()&&e&&(a=A("h2",{className:"outline-chapters__title"},[e]),this.$title=a,r.push(a)),o=A("ul",{className:"outline-chapters__list"},[""]),this.$list=o,h=A("div",{className:"outline-chapters__placeholder"},[""]),this.$placeholder=h,n=A("div",{className:"outline-chapters__main"},[o,h]),this.$main=n,r.push(n),l=A("nav",{id:"outline-chapters",className:"outline-chapters outline-chapters_hidden"},r),this.$el=l,this.isSticky()&&(this.calculateStickyHeight(),U(l,"outline-chapters_sticky")),s&&U(l,s),t.appendChild(l),i.appendChild(t),this):this}render(){const t=this.attr("showCode"),e=this.attr("mounted"),s=this.$parentElement,r=this.chapters;let l,n;return!s||r.length<1||(this._paintEdge(),l=this.$el,n=this.$list,((t,e,s=!1)=>{const i=t=>document.querySelector(`#${t}`);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=A("span",{className:"outline-chapters__text"},[e.text]),h=A("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},[o]);let a,c,d,u;s&&(a=A("span",{className:"outline-chapters__code","data-id":l},[e.code]),h.insertBefore(a,h.firstChild)),c=A("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},[h]),-1===r?t.appendChild(c):(u=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(c):(d=A("ul",{id:"subject-"+r,className:"outline-chapters__subject"},[c]),u.appendChild(d)))}))})(n,r,t),O(l,"outline-chapters_hidden"),this.positionPlaceholder(this.active),this.offsetTop=d(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),I("--outline-chapters-width",`${this.offsetWidth}px`)),i(e)&&e.call(this),this.onObserver()),this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=parseInt(Q(e,"padding-top"),10),n=parseInt(Q(e,"border-top-width"),10),o=parseInt(Q(s,"padding-top"),10),h=parseInt(Q(s,"margin-top"),10),a=parseInt(Q(s,"border-top-width"),10);let c,d=r.offsetHeight,u=0;return l&&(u+=l),o&&(u+=o),h&&(u+=h),n&&(u+=n),a&&(u+=a),c=d*t,i.style.cssText=`transform: translateY(${u+c}px);height:${d}px;`,this}highlight(t){const e=this.$el.querySelector(`#chapter__anchor-${t}`),s="outline-chapters_active";return e?(this.$active&&O(this.$active,s),this.active=parseInt(e.getAttribute("data-id"),10),this.$active=e,U(this.$active,s),this.positionPlaceholder(this.active),this):this}sticky(){const t=this.attr("afterSticky"),e="outline-chapters_fixed",s=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?U(s,e):O(s,e),i(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return I("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}show(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterOpened"),r=this.$el,l=this.$parentElement;return this.isInside()?(O(l,e),O(r,e),o((()=>{O(l,t),O(r,t)}),30)):O(r,e),this.closed=!1,i(s)&&s.call(this),this}hide(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterClosed"),r=this.$el,l=this.$parentElement;return this.isInside()?(U(l,t),U(r,t),o((()=>{U(l,e),U(r,e)}))):U(r,e),this.closed=!0,i(s)&&s.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&o((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(W.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.active=0,this.offsetTop=0,this.$active=null,this.closed=!1,this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),i(e)&&e.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let e=null;return this.Observer=((t,e={})=>{const s=e.root||null,r=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),a=n(s)?s:document;return s&&(o.root=s),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const s=t.getAttribute("data-id");if(this.playing)return!1;e&&clearTimeout(e),e=o((()=>{this.highlight(s)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),l=s.href.split("#")[1],n=document.querySelector(`#${l}`),h=d(n)-(e+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),o((()=>{this.playing=!1,T("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),o((()=>{this.scrollTo(h,u),this.highlight(r)}),10)):(this.scrollTo(h,u),this.highlight(r)),$(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=o((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),T("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=o((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),y(t,".outline-chapters__anchor","click",this.onSelect,this,!0),P(i,"scroll",this.onScroll,this,!0),this.isSticky()&&P(i,"resize",this.onResize,this,!0),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),b(e,"click",this.onSelect),b(r,"scroll",this.onScroll),this.isSticky()&&P(r,"resize",this.onResize),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}W.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const V=(t,e=!0)=>{const s=M(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=A("a",{className:"outline-toolbar__anchor",href:t.link},[s]),r=A("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return U(s,"outline-toolbar__icon"),e&&U(r,"outline-toolbar_rounded"),t.disabled&&U(r,"outline-toolbar_disabled"),r},J="outline-toolbar_disabled",Y="outline-toolbar_hidden";class G extends l{constructor(t){super(),this.attrs=G.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,H(i,s)?O(i,s):U(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),r=this.attr("placement"),l=document.createDocumentFragment(),n=document.createDocumentFragment();return L(),e.forEach((t=>{const e=V(t,s);l.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=A("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},[l]),n.appendChild(this.$el),document.body.appendChild(n),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),l=t.action,n=document.createDocumentFragment();let o;return r(t)?(s.push(t),n.appendChild(V(t))):w(t)&&t.forEach((t=>{n.appendChild(V(t))})),e.appendChild(n),l&&i(l.handler)&&(o=l.type||"click",y(e,`.${t.name}`,o,l.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,n,o,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(n=l.type||"click",o=l.handler),e?(O(h,J),n&&o&&y(s,`.${t}`,n,o)):(U(h,J),n&&o&&b(s,n,o)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(U(this.$el,J),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,O(this.$el,J),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),O(l,Y)}else O(r,Y),this.closed=!1,i(e)&&o((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),U(l,Y)}else U(r,Y),this.closed=!0,i(e)&&o((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(G.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(V(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const r=e.action;let l,n,o,h;if(this.disabled)return!1;r&&(n=r.handler,t(n)&&(h=n,r.handler=function(){T(h,e.name)},n=r.handler),l=r.type||"click",o=r.context),i(n)&&y(s,`.${e.name}`,l,n,o||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let r,l;if(this.disabled)return!1;s&&(l=s.handler,r=s.type||"click"),i(l)&&b(e,r,l)})),this}}G.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const K=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),X=(t,e,s=null)=>{const r=K();let l="symbol"==typeof t?t.toString():t;return i(e)?(v[l]||(v[l]=[]),v[l].push({topic:l,callback:e,context:s,token:r}),r):""},Z=t=>{if(!e(v,t))return!1;delete v[t]},tt=(t,e)=>{if(!_(t))return!1;e?(t=>{const e=Object.keys(v);if(!t||e.length<1)return!1;e.forEach((e=>{const s=v[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&Z(i)}))})(e):Z(t)};class et extends l{constructor(t){super(),this.attrs=et.DEFAULTS,this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,this.buttons=[],t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){const t=this.attr("scrollElement"),e=document.querySelector(t)||document.getElementById(t);return this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar(),e&&this.onToolbarUpdate({top:e.scrollTop,min:0,max:e.scrollHeight}),this}_renderPrint(){const e=this.attr("print"),s=this.attr("articleElement");let i;return e.element?(t(s)?i=document.querySelector(s):n(s)&&(i=s),U(i,"outline-article"),((e,s)=>{let i,r,l,h,a,c=s;t(e)?i=document.querySelector(e)||document.getElementById(e):n(e)&&(i=e),l=i.querySelector("h1"),n(s)&&(l=s),n(l)&&(c=l.innerText),r=A("article",{className:"outline-print"},[""]),r.innerHTML=i.innerHTML,l=A("h1",{className:"outline-print__title"},[c]),r.insertBefore(l,r.firstChild),document.body.appendChild(r),o((()=>{for(h=r.previousElementSibling;h;)a=h.tagName.toLowerCase(),"script"!==a&&"style"!==a&&U(h,"outline-print_sibling"),h=h.previousElementSibling;for(h=r.nextElementSibling;h;)a=h.tagName.toLowerCase(),"script"!==a&&"style"!==a&&U(h,"outline-print_sibling"),h=h.nextElementSibling}),350)})(e.element,e.title),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.attr("afterScroll"),o=this.attr("chapterTextFilter");return this.anchors=new j({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:n,chapterTextFilter:o}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("position"),n=this.attr("placement"),o=this.attr("afterSticky"),h=this.attr("afterToggle"),a=this.attr("afterScroll"),c=this.count();let d,u=this.attr("parentElement");return c<1||(d={scrollElement:s,showCode:r,position:l,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:o,afterToggle:h,afterScroll:a},"relative"===l?(this.drawer=new R({placement:n,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),u=this.drawer.$main):d.customClass=i,d.parentElement=u,this.chapters=new W(d)),this}_renderToolbar(){const t=this.attr("placement"),e=this.attr("homepage"),s=this.attr("git"),i=this.attr("tags"),r=this.attr("issues"),l=this.attr("tools"),n=this.count(),o={name:"homepage",icon:"homepage",size:20,link:e},h={name:"github",icon:"github",size:20,link:s},a={name:"tags",icon:"tags",size:20,link:i},c={name:"issues",icon:"issues",size:20,link:r},d={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},u=[];return u.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),n>0&&u.push(d),e&&u.push(o),s&&u.push(h),i&&u.push(a),r&&u.push(c),l?.length>0&&u.push(...l),u.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.buttons=[...u],this.toolbar=new G({placement:t,buttons:u}),this}addButton(t){const e=this.toolbar,s=this.buttons;return s.splice(-1,0,t),e.attr({buttons:s}),e.refresh(),this}removeButton(t){return this.toolbar.remove(t),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,s=this.chapters,r=this.count();return r>0&&(s.playing=!0),this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),r>0&&(s.highlight(0),s.playing=!1),i(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=a(this.attr("scrollElement")),s=this.toolbar,r=this.chapters,l=this.count(),n=Math.floor(e.scrollHeight-e.clientHeight);return l>0&&(r.playing=!0),this.scrollTo(n,(()=>{s.hide("down"),s.show("up"),l>0&&(r.highlight(l-1),r.playing=!1),i(t)&&t.call(s,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return c(s,t,e),this}toggle(){const t=this.attr("position"),e=this.toolbar,s=this.drawer,i=this.chapters;return this.count()<1||("relative"!==t?(i.toggle(),e.highlight("menu")):(e.toggle(),o((()=>{i.isInside()?i.toggle():s.toggle()})))),this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar,r=!1;const l=this.count();return this.removeListeners(),l>0&&(r=e.isOutside(),e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(et.DEFAULTS),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&r {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from '../types/isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n let $rootElements\n let $scrollElement\n\n if (!scrollElement) {\n $rootElements = document.querySelectorAll('html,body')\n $scrollElement =\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n ? $rootElements[0]\n : $rootElements[1]\n } else {\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n }\n\n return $scrollElement\n}\n\nexport default _getScrollElement\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n const $scrollElement = _getScrollElement(scrollElement)\n let scrollTop = $scrollElement.scrollTop\n let step = 0\n const distance = top - scrollTop\n const MAX_HEIGHT = $scrollElement.scrollHeight\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n const stop = (top) => {\n if (isFunction(afterStop)) {\n afterStop(top)\n }\n\n return false\n }\n const play = () => {\n step += 1\n\n // 向上滚动\n if (distance < 0) {\n scrollTop -= easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop <= top) {\n $scrollElement.scrollTop = top\n return stop(top)\n }\n } else {\n scrollTop += easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop >= MAX_TOP) {\n $scrollElement.scrollTop = MAX_TOP\n return stop(MAX_TOP)\n }\n }\n\n requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} data - (必须)数据对象\n * @param {Boolean} async - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg =\n `` +\n `` +\n ``\n }\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n if (isSVG(name)) {\n $svg = $icon.querySelector('svg')\n $svg.setAttribute('aria-hidden', 'true')\n $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n $svg.setAttribute('class', 'outline-icon__svg')\n $svg.setAttribute('width', '200')\n $svg.setAttribute('height', '200')\n $svg.style = cssRules\n }\n\n return $icon\n}\n\nexport default createElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import removeClass from './utils/dom/removeClass'\nimport isEmpty from './utils/types/isEmpty'\nimport trim from './utils/lang/trim'\n\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\n let $anchor\n\n $heading.innerHTML = text.replace(pattern, '')\n $heading.removeAttribute('id')\n $heading.removeAttribute('data-id')\n\n removeClass($heading, CLS_HEADING)\n\n if (!hasAnchor) {\n return false\n }\n\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\n\n if (isAtStart) {\n removeClass($heading, `${CLS_HEADING}_start`)\n }\n\n if (isEmpty(trim($heading.className))) {\n $heading.removeAttribute('class')\n }\n\n $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\n","import isString from './isString'\n/**\n * 检测数据是否为空字符串\n * ========================================================================\n * @method isEmpty\n * @param {String} str\n * @returns {boolean}\n */\nconst isEmpty = (str) => {\n return isString(str) && str === ''\n}\n\nexport default isEmpty\n","import trim from './utils/lang/trim'\nimport stripTags from './utils/lang/stripTags'\nimport isFunction from './utils/types/isFunction'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\n/**\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\n * ========================================================================\n * @method getChapters\n * @param {Array} headings\n * @param {Boolean} [showCode]\n * @param {Function} [chapterTextFilter]\n * @return {*|*[]}\n */\nconst getChapters = (headings, showCode = true, chapterTextFilter = null) => {\n let previous = 1\n let level = 0\n let text = ''\n const chapters = []\n\n headings.forEach((heading, i) => {\n const tagName = heading.tagName\n const headingLevel = tagName.replace(/h/i, '')\n let current = parseInt(headingLevel, 10)\n let pid = -1\n\n // 场景1:当前标题是前一个标题的子标题\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\n // h2 (前一个标题)\n // h3 (当前标题)\n if (current > previous) {\n level += 1\n\n // 第一层级的 pid 是 -1\n if (level === 1) {\n pid = -1\n } else {\n pid = i - 1\n }\n }\n // 场景2:当前标题和前一个标题层级相同\n // 当前标题的(标题标签)序号 = 前一个标题的序号\n // h2 (前一个标题)\n // h2 (当前标题)\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\n // h2\n // h4 (前一个标题)\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\n else if (current === previous || (current < previous && current > level)) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n pid = -1\n } else {\n pid = chapters[i - 1].pid\n }\n }\n // 场景3:当前标题比前一个标题层级高\n else if (current <= level) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n } else {\n level = level - (previous - current)\n\n if (level <= 1) {\n level = 1\n }\n }\n\n // 第一级的标题\n if (level === 1) {\n pid = -1\n } else {\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\n }\n }\n\n previous = current\n\n text = stripTags(trim(heading.innerHTML))\n\n if (isFunction(chapterTextFilter)) {\n text = chapterTextFilter(text)\n }\n\n chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text,\n tagName\n })\n })\n\n return showCode ? _getChaptersWithCode(chapters) : chapters\n}\n\nexport default getChapters\n","import isString from '../types/isString'\n\n/**\n * 过滤所有 HTML 标签\n * ========================================================================\n * @method stripTags\n * @param {string} str\n * @returns {string}\n */\nconst stripTags = (str) => {\n if (!isString(str)) {\n return ''\n }\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\n}\n\nexport default stripTags\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\n let previous = chapters[index - 1]\n let pid\n let i\n\n for (i = 0; i < differ; i += 1) {\n pid = previous.pid\n previous = chapters[pid]\n }\n\n pid = previous.pid\n\n return pid\n}\n\nexport default _getChapterParentIdByDiffer\n","import isArray from './utils/types/isArray'\n\nconst _getChaptersWithCode = (chapters) => {\n const groups = {}\n const cb = (o) => {\n return [o.pid]\n }\n\n chapters.forEach((o) => {\n const group = JSON.stringify(cb(o))\n\n groups[group] = groups[group] || []\n groups[group].push(o)\n\n o.index = groups[group].length\n if (o.pid === -1) {\n o.code = String(o.index)\n }\n })\n\n Object.keys(groups).forEach((group) => {\n groups[group].forEach((c) => {\n const subjects = groups[`[${c.id}]`]\n if (!subjects || !isArray(subjects)) {\n return false\n }\n subjects.forEach((o) => {\n o.code = c.code + '.' + o.index\n })\n })\n })\n\n return chapters\n}\n\nexport default _getChaptersWithCode\n","import Base from './base'\n\n// 在文章的标题生成 anchor 链接\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport toTree from './utils/lang/toTree'\nimport later from './utils/lang/later'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport offsetTop from './utils/dom/offsetTop'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport publish from './utils/observer/emit'\nimport paint from './utils/icons/paint'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n const showCode = this.attr('showCode') || true\n let created\n let scrollElement\n let selector\n let $articleElement\n let articleElement\n\n this.attr(options)\n articleElement = this.attr('articleElement')\n scrollElement = this.attr('scrollElement')\n selector = this.attr('selector')\n created = this.attr('created')\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n if (!$articleElement) {\n return this\n }\n\n this.$articleElement = $articleElement\n this.$scrollElement = _getScrollElement(scrollElement)\n this.$headings = [...$articleElement.querySelectorAll(selector)]\n\n if (this.$headings.length < 1) {\n return this\n }\n\n this.chapters = getChapters(\n this.$headings,\n showCode,\n this.attr('chapterTextFilter')\n )\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n getChapters(isTreeStructured = false) {\n const chapters = this.chapters\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\n }\n\n count() {\n return this.chapters.length\n }\n\n render() {\n const mounted = this.attr('mounted')\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const $headings = this.$headings\n const chapters = this.getChapters()\n\n paint()\n\n $headings.forEach(($heading, i) => {\n const chapterCode = chapters[i].code\n _updateHeading($heading, i, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n destroy() {\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n onAnchorTrigger(evt) {\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const $heading = $anchor.parentNode\n const top = offsetTop($heading) - (stickyHeight + 10)\n const $scrollElement = this.$scrollElement\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'anchor')\n }\n\n later(() => {\n publish('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.scrollTo(top, after)\n\n if (!anchorURL) {\n stop(evt)\n }\n\n return this\n }\n\n addListeners() {\n const $articleElement = this.$articleElement\n\n on(\n $articleElement,\n '.outline-heading__anchor',\n 'click',\n this.onAnchorTrigger,\n this,\n true\n )\n\n return this\n }\n\n removeListeners() {\n const $articleElement = this.$articleElement\n\n off($articleElement, 'click', this.onAnchorTrigger)\n\n return this\n }\n}\n\nAnchors.DEFAULTS = {\n scrollElement: 'html,body',\n articleElement: '#article',\n selector: 'h1,h2,h3,h4,h5,h6',\n stickyHeight: 0,\n anchorURL: '',\n hasAnchor: true,\n isAtStart: true,\n showCode: false,\n created: null,\n mounted: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n chapterTextFilter: null\n}\n\nexport default Anchors\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttribute from './utils/dom/setAttribute'\n\nimport icon from './utils/icons/icon'\n\nconst _updateHeading = ($heading, i, options) => {\n const $fragment = document.createDocumentFragment()\n const CLS_HEADING = 'outline-heading'\n const hasAnchor = options.hasAnchor || true\n const isAtStart = options.isAtStart || true\n const showCode = options.showCode || false\n const chapterCode = options.chapterCode || ''\n const anchorURL = options.anchorURL || ''\n const headingId = `heading-${i}`\n const attrs = {\n id: headingId,\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\n 'data-id': i\n }\n const keys = Object.keys(attrs)\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n keys.forEach((prop) => {\n setAttribute($heading, prop, attrs[prop])\n })\n\n if (showCode) {\n $heading.innerHTML = chapterCode + ' ' + text\n }\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = icon('hash', { iconSet: 'outline' })\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL || `#${headingId}`,\n target: anchorURL ? '_blank' : 'self',\n 'data-id': i\n },\n [$icon]\n )\n $fragment.appendChild($anchor)\n $heading.appendChild($fragment)\n}\n\nexport default _updateHeading\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\n\nlet index = 2000\n\nconst zIndex = (idx) => {\n if (idx) {\n index = idx\n } else {\n index += 1\n }\n\n setProperty('--outline-zIndex', `${index}`)\n\n return index\n}\n\nexport default zIndex\n","import Base from './base'\n\nimport later from './utils/lang/later'\nimport isFunction from './utils/types/isFunction'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport paint from './utils/icons/paint'\nimport icon from './utils/icons/icon'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = true\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n\n this.title = this.attr('title')\n created = this.attr('created')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n return this\n }\n\n setTitle(title) {\n this.attr('title', title)\n this.title = title\n this.$title.innerHTML = title\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n render() {\n const mounted = this.attr('mounted')\n const size = this.attr('size')\n const placement = this.attr('placement')\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const hasOffset = this.attr('hasOffset')\n const hasPadding = this.attr('hasPadding')\n const autoHeight = this.attr('autoHeight')\n const customClass = this.attr('customClass')\n let $el\n let $modal\n let $header\n let $title\n let $close\n let $main\n let $footer\n let $overlay\n\n paint()\n this.zIndex = zIndex()\n\n $title = createElement(\n 'h2',\n {\n className: 'outline-drawer__title'\n },\n [this.title]\n )\n this.$title = $title\n\n if (hasClose) {\n $close = createElement(\n 'div',\n {\n className: 'outline-drawer__close'\n },\n [icon('close', { size: 20 })]\n )\n this.$close = $close\n }\n\n $header = createElement(\n 'header',\n {\n className: 'outline-drawer__header'\n },\n [$title, $close]\n )\n this.$header = $header\n\n $main = createElement(\n 'div',\n {\n className: 'outline-drawer__main'\n },\n ['']\n )\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement(\n 'footer',\n {\n className: 'outline-drawer__footer'\n },\n ['']\n )\n this.$footer = $footer\n\n $modal = createElement(\n 'div',\n {\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\n },\n [$header, $main, $footer]\n )\n this.$modal = $modal\n\n if (hasOffset) {\n addClass($modal, 'outline-drawer_offset')\n }\n\n if (autoHeight) {\n addClass($modal, 'outline-drawer_auto')\n }\n\n if (customClass) {\n addClass($modal, customClass)\n }\n\n if (hasOverlay) {\n $overlay = createElement(\n 'div',\n {\n className: 'outline-drawer__overlay'\n },\n ['']\n )\n this.$overlay = $overlay\n }\n\n $el = createElement(\n 'div',\n {\n className: `outline-drawer`\n },\n [$modal, $overlay]\n )\n this.$el = $el\n document.body.appendChild($el)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n open() {\n const opened = this.attr('afterOpened')\n const $modal = this.$modal\n\n addClass(this.$el, 'outline-drawer_opened')\n removeClass($modal, 'outline-drawer_closed')\n addClass($modal, 'outline-drawer_opened')\n\n later(() => {\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n })\n\n return this\n }\n\n close() {\n const closed = this.attr('afterClosed')\n const $modal = this.$modal\n\n removeClass($modal, 'outline-drawer_opened')\n addClass($modal, 'outline-drawer_closed')\n\n later(() => {\n removeClass(this.$el, 'outline-drawer_opened')\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n })\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const closed = this.isClosed()\n\n if (closed) {\n this.open()\n } else {\n this.close()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n afterToggle.call(this, closed)\n })\n }\n\n return this\n }\n\n destroy() {\n const afterDestroy = this.attr('afterDestroy')\n const beforeDestroy = this.attr('beforeDestroy')\n let index = this.zIndex\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = false\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n\n index -= 1\n zIndex(index)\n this.zIndex = 0\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n addListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay) {\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (!hasClose && !hasOverlay) {\n return this\n }\n\n off($el, 'click', this.onClose)\n\n return this\n }\n\n onClose() {\n this.close()\n return this\n }\n}\n\nDrawer.DEFAULTS = {\n placement: 'rtl',\n title: '标题',\n size: 'regular',\n hasClose: true,\n hasOverlay: true,\n hasOffset: false,\n hasPadding: true,\n autoHeight: true,\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterToggle: null\n}\n\nexport default Drawer\n","import isFunction from '../types/isFunction'\nimport off from './off'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定事件\n * ========================================================================\n * @method at\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst at = (el, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n const listener = function (evt) {\n let overrideContext = context || el\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n\n if (!isFunction(fn)) {\n return false\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default at\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport later from './utils/lang/later'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport createElement from './utils/dom/createElement'\nimport scrollTo from './utils/dom/scrollTo'\nimport addClass from './utils/dom/addClass'\nimport intersection from './utils/dom/intersection'\nimport removeClass from './utils/dom/removeClass'\nimport offsetTop from './utils/dom/offsetTop'\nimport getStyle from './utils/dom/getStyle'\nimport setProperty from './utils/dom/setProperty'\nimport publish from './utils/observer/emit'\n\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = Chapters.DEFAULTS\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.chapters = []\n this.closed = false\n this.active = 0\n this.offsetTop = 0\n this.offsetWidth = 0\n this.$active = null\n this.scrollTimer = null\n this.resizeTimer = null\n this.playing = false\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n let parentElement\n let scrollElement\n let $parent\n\n this.attr(options)\n created = this.attr('created')\n parentElement = this.attr('parentElement')\n scrollElement = this.attr('scrollElement')\n\n if (isString(parentElement)) {\n $parent = document.querySelector(parentElement)\n } else if (isElement(parentElement)) {\n $parent = parentElement\n }\n this.$parentElement = $parent\n this.$scrollElement = _getScrollElement(scrollElement)\n\n this.chapters = this.attr('chapters')\n this.closed = this.attr('closed')\n this.active = this.attr('active')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n if (this.chapters.length < 1) {\n return this\n }\n\n this.render().addListeners()\n\n this.$active = document.querySelector(`#chapter-${this.active}`)\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n isSticky() {\n const position = this.attr('position')\n return position === 'sticky'\n }\n\n isFixed() {\n const position = this.attr('position')\n return position === 'fixed'\n }\n\n isInside() {\n return this.isFixed() || this.isSticky()\n }\n\n isOutside() {\n return !this.isInside()\n }\n\n _paintEdge() {\n const $fragment = document.createDocumentFragment()\n const STICKY = 'outline-chapters_sticky'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\n const contents = []\n let $title = null\n let $el\n let $main\n let $list\n let $placeholder\n\n if (!$parentElement) {\n return this\n }\n\n if (this.isInside() && title) {\n $title = createElement(\n 'h2',\n {\n className: 'outline-chapters__title'\n },\n [title]\n )\n this.$title = $title\n contents.push($title)\n }\n\n $list = createElement(\n 'ul',\n {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list`\n },\n ['']\n )\n this.$list = $list\n\n $placeholder = createElement(\n 'div',\n {\n className: 'outline-chapters__placeholder'\n },\n ['']\n )\n this.$placeholder = $placeholder\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n [$list, $placeholder]\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: `outline-chapters ${HIDDEN}`\n },\n contents\n )\n this.$el = $el\n\n if (this.isSticky()) {\n this.calculateStickyHeight()\n addClass($el, STICKY)\n }\n\n if (customClass) {\n addClass($el, customClass)\n }\n $fragment.appendChild($el)\n $parentElement.appendChild($fragment)\n\n return this\n }\n\n render() {\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n const chapters = this.chapters\n let $el\n let $list\n\n if (!$parentElement || chapters.length < 1) {\n return this\n }\n\n console.time('chapters')\n this._paintEdge()\n\n $el = this.$el\n $list = this.$list\n _paintChapters($list, chapters, showCode)\n removeClass($el, HIDDEN)\n this.positionPlaceholder(this.active)\n console.timeEnd('chapters')\n\n this.offsetTop = offsetTop($el)\n this.offsetWidth = $el.offsetWidth\n\n if (this.isFixed()) {\n this.sticky()\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n this.onObserver()\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\n const placeholderBorderTop = parseInt(\n getStyle($list, 'border-top-width'),\n 10\n )\n let height = $anchor.offsetHeight\n let offsetTop = 0\n let top\n\n if (mainPaddingTop) {\n offsetTop += mainPaddingTop\n }\n\n if (placeholderPaddingTop) {\n offsetTop += placeholderPaddingTop\n }\n\n if (placeholderMarginTop) {\n offsetTop += placeholderMarginTop\n }\n\n if (mainBorderTop) {\n offsetTop += mainBorderTop\n }\n\n if (placeholderBorderTop) {\n offsetTop += placeholderBorderTop\n }\n\n top = height * index\n // top:calc(${offsetTop}px + ${top}px);\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const HIGHLIGHT = 'outline-chapters_active'\n\n if (!$anchor) {\n return this\n }\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n this.$active = $anchor\n addClass(this.$active, HIGHLIGHT)\n\n this.positionPlaceholder(this.active)\n\n return this\n }\n\n sticky() {\n const afterSticky = this.attr('afterSticky')\n const FIXED = 'outline-chapters_fixed'\n const $el = this.$el\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (!this.isFixed()) {\n return this\n }\n\n isStickying = scrollTop >= top\n\n if (isStickying) {\n addClass($el, FIXED)\n } else {\n removeClass($el, FIXED)\n }\n\n if (isFunction(afterSticky)) {\n afterSticky.call(this, this.isClosed(), isStickying)\n }\n\n return this\n }\n\n calculateStickyHeight() {\n const documentElement = document.documentElement\n const height = Math.max(\n documentElement.clientHeight || 0,\n window.innerHeight || 0\n )\n setProperty('--outline-sticky-height', `${height}px`)\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n show() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const opened = this.attr('afterOpened')\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n removeClass($parent, HIDDEN)\n removeClass($el, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n removeClass($el, FOLDED)\n }, 30)\n } else {\n removeClass($el, HIDDEN)\n }\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n\n return this\n }\n\n hide() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const closed = this.attr('afterClosed')\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n addClass($parent, FOLDED)\n addClass($el, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n addClass($el, HIDDEN)\n })\n } else {\n addClass($el, HIDDEN)\n }\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n isStickying = scrollTop >= top\n afterToggle.call(this, this.isClosed(), isStickying)\n })\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.$active = null\n this.closed = false\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n this.scrollTimer = null\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n this.resizeTimer = null\n }\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\n\n this.Observer = intersection(\n ($heading) => {\n const id = $heading.getAttribute('data-id')\n\n if (this.playing) {\n return false\n }\n\n if (timer) {\n clearTimeout(timer)\n }\n\n timer = later(() => {\n this.highlight(id)\n }, 100)\n },\n {\n selector,\n context: this\n }\n )\n\n return this\n }\n\n onSelect(evt) {\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const id = $anchor.getAttribute('data-id')\n const headingId = $anchor.href.split('#')[1]\n const $heading = document.querySelector(`#${headingId}`)\n const top = offsetTop($heading) - (stickyHeight + 10)\n const min = 0\n const max = this.$scrollElement.scrollHeight\n const afterScroll = this.attr('afterScroll')\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'chapter')\n }\n\n later(() => {\n this.playing = false\n publish('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.playing = true\n if (this.isFixed()) {\n this.sticky()\n later(() => {\n this.scrollTo(top, after)\n this.highlight(id)\n }, 10)\n } else {\n this.scrollTo(top, after)\n this.highlight(id)\n }\n\n stop(evt)\n\n return this\n }\n\n onScroll() {\n const $scrollElement = this.$scrollElement\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n }\n\n this.scrollTimer = later(() => {\n const top = $scrollElement.scrollTop\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n\n if (this.isFixed()) {\n this.sticky()\n }\n\n publish('toolbar:update', {\n top,\n min,\n max\n })\n }, 100)\n\n return this\n }\n\n onResize() {\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n }\n\n this.resizeTimer = later(() => {\n this.calculateStickyHeight()\n })\n\n return this\n }\n\n addListeners() {\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\n at($element, 'scroll', this.onScroll, this, true)\n if (this.isSticky()) {\n at($element, 'resize', this.onResize, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const selector = this.attr('selector')\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n off($el, 'click', this.onSelect)\n off($element, 'scroll', this.onScroll)\n\n if (this.isSticky()) {\n at($element, 'resize', this.onResize)\n }\n\n if (this.Observer) {\n document.querySelectorAll(selector).forEach((section) => {\n this.Observer.unobserve(section)\n })\n }\n\n return this\n }\n}\n\nChapters.DEFAULTS = {\n parentElement: '',\n scrollElement: '',\n selector: '.outline-heading',\n active: 0,\n closed: false,\n showCode: true,\n position: 'relative',\n stickyHeight: 0,\n chapters: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterSticky: null\n}\n\nexport default Chapters\n","import createElement from './utils/dom/createElement'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const byId = (id) => document.querySelector(`#${id}`)\n\n chapters.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n [chapter.text]\n )\n const $link = createElement(\n 'a',\n {\n id: `chapter__anchor-${id}`,\n className: 'outline-chapters__anchor',\n href: '#' + rel,\n rel: rel,\n 'data-id': id\n },\n [$text]\n )\n let $code\n let $li\n let $ul\n let $parent\n\n if (showCode) {\n $code = createElement(\n 'span',\n {\n className: 'outline-chapters__code',\n 'data-id': id\n },\n [chapter.code]\n )\n\n $link.insertBefore($code, $link.firstChild)\n }\n\n $li = createElement(\n 'li',\n {\n id: `chapter-${id}`,\n className: 'outline-chapters__item',\n 'data-id': id\n },\n [$link]\n )\n\n if (pid === -1) {\n $list.appendChild($li)\n } else {\n $parent = byId(`chapter-${pid}`)\n $ul = byId(`subject-${pid}`)\n\n if (!$ul) {\n $ul = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n [$li]\n )\n\n $parent.appendChild($ul)\n } else {\n $ul.appendChild($li)\n }\n }\n })\n}\n\nexport default _paintChapters\n","import isFunction from '../types/isFunction'\nimport isElement from '../types/isElement'\n\n/**\n * 通用的 IntersectionObserver 观察者处理器\n * ========================================================================\n * @method intersection\n * @param {Function} fn\n * @param {Object} [props]\n * @param {Object|HTMLElement} [props.root]\n * @param {String} [props.selector]\n * @param {Object} [props.context]\n * @param {String} [props.attr]\n * @param {String} [props.rootMargin]\n */\nconst intersection = (fn, props = {}) => {\n const root = props.root || null\n const selector = props.selector || '.outline-heading'\n const context = props.context || null\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\n const options = {\n rootMargin: rootMargin\n }\n const Observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.intersectionRatio > 0) {\n if (isFunction(fn)) {\n fn.call(context || entry.target, entry.target)\n }\n }\n })\n }, options)\n const $root = isElement(root) ? root : document\n\n if (root) {\n options.root = root\n }\n\n $root.querySelectorAll(selector).forEach((section) => {\n Observer.observe(section)\n })\n\n return Observer\n}\n\nexport default intersection\n","import icon from './utils/icons/icon'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = icon(button.icon, {\n iconSet: button.iconSet || 'outline',\n color: button.color || '',\n size: button.size\n })\n const $anchor = createElement(\n 'a',\n {\n className: `outline-toolbar__anchor`,\n href: button.link\n },\n [$icon]\n )\n const $button = createElement(\n 'div',\n {\n className: `outline-toolbar__button ${button.name}`\n },\n [button.link ? $anchor : $icon]\n )\n\n addClass($icon, 'outline-toolbar__icon')\n\n if (rounded) {\n addClass($button, 'outline-toolbar_rounded')\n }\n\n if (button.disabled) {\n addClass($button, 'outline-toolbar_disabled')\n }\n\n return $button\n}\n\nexport default _createButton\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isObject from './utils/types/isObject'\nimport isArray from './utils/types/isArray'\nimport later from './utils/lang/later'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\nimport hasClass from './utils/dom/hasClass'\nimport removeClass from './utils/dom/removeClass'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport publish from './utils/observer/emit'\nimport paint from './utils/icons/paint'\n\nimport _createButton from './_createButton'\n\nconst DISABLED = 'outline-toolbar_disabled'\nconst HIDDEN = 'outline-toolbar_hidden'\n\nclass Toolbar extends Base {\n constructor(options) {\n super()\n\n this.attrs = Toolbar.DEFAULTS\n this.$el = null\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n created = this.attr('created')\n this.disabled = this.attr('disabled')\n this.closed = this.attr('closed')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n isDisabled(name) {\n const buttons = this.attr('buttons')\n let button\n\n if (name) {\n button = buttons.find((option) => option.name === name)\n\n return button?.disabled\n }\n\n return this.disabled\n }\n\n isClosed() {\n return this.closed\n }\n\n highlight(name) {\n const button = this.buttons.find((item) => item.name === name)\n const ACTIVE = 'outline-toolbar_active'\n let $button\n\n if ($button) {\n return this\n }\n\n $button = button.$el\n\n if (hasClass($button, ACTIVE)) {\n removeClass($button, ACTIVE)\n } else {\n addClass($button, ACTIVE)\n }\n\n return this\n }\n\n render() {\n const mounted = this.attr('mounted')\n const buttons = this.attr('buttons') || []\n const rounded = this.attr('rounded')\n const placement = this.attr('placement')\n const $buttons = document.createDocumentFragment()\n const $fragment = document.createDocumentFragment()\n\n paint()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $buttons.appendChild($button)\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el = createElement(\n 'div',\n {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n },\n [$buttons]\n )\n $fragment.appendChild(this.$el)\n document.body.appendChild($fragment)\n\n if (this.closed) {\n this.hide()\n }\n\n if (this.disabled) {\n this.disable()\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n add(button) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const action = button.action\n const $fragment = document.createDocumentFragment()\n let type\n\n if (isObject(button)) {\n buttons.push(button)\n $fragment.appendChild(_createButton(button))\n } else if (isArray(button)) {\n button.forEach((item) => {\n $fragment.appendChild(_createButton(item))\n })\n }\n $el.appendChild($fragment)\n\n if (action && isFunction(action.handler)) {\n type = action.type || 'click'\n on($el, `.${button.name}`, type, action.handler)\n }\n\n return this\n }\n\n remove(name) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let index = -1\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((button, i) => {\n if (button.name === name) {\n index = i\n }\n })\n\n if (index > -1) {\n this.attr().buttons.splice(index, 1)\n }\n\n $button = $el.querySelector(`.${name}`)\n this.switch(name, false)\n $el.removeChild($button)\n\n return this\n }\n\n switch(name, enabled) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let action\n let type\n let listener\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((option) => {\n if (option.name === name) {\n button.disabled = !enabled\n }\n })\n\n action = button.action\n $button = $el.querySelector(`.${name}`)\n\n if (action) {\n type = action.type || 'click'\n listener = action.handler\n }\n\n if (enabled) {\n removeClass($button, DISABLED)\n\n if (type && listener) {\n on($el, `.${name}`, type, listener)\n }\n } else {\n addClass($button, DISABLED)\n\n if (type && listener) {\n off($el, type, listener)\n }\n }\n\n return this\n }\n\n disable(name) {\n const disabled = this.attr('afterDisabled')\n\n if (name) {\n this.switch(name, false)\n } else {\n addClass(this.$el, DISABLED)\n this.removeListeners()\n this.disabled = true\n\n if (isFunction(disabled)) {\n disabled.call(this)\n }\n }\n\n return this\n }\n\n enable(name) {\n const enabled = this.attr('afterEnabled')\n\n if (name) {\n this.switch(name, true)\n } else {\n this.disabled = false\n removeClass(this.$el, DISABLED)\n this.addListeners()\n\n if (isFunction(enabled)) {\n enabled.call(this)\n }\n }\n\n return this\n }\n\n show(name) {\n const opened = this.attr('afterOpened')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n\n $button = $el.querySelector(`.${name}`)\n removeClass($button, HIDDEN)\n } else {\n removeClass($el, HIDDEN)\n this.closed = false\n\n if (isFunction(opened)) {\n later(() => {\n opened.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n hide(name) {\n const closed = this.attr('afterClosed')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n $button = $el.querySelector(`.${name}`)\n addClass($button, HIDDEN)\n } else {\n addClass($el, HIDDEN)\n this.closed = true\n\n if (isFunction(closed)) {\n later(() => {\n closed.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n toggle() {\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n let $el = this.$el\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n document.body.removeChild($el)\n $el = null\n\n this.attr(Toolbar.DEFAULTS)\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n refresh() {\n const $el = this.$el\n const buttons = this.attr('buttons') || []\n\n this.removeListeners()\n $el.innerHTML = ''\n\n buttons.forEach((button) => {\n this.$el.appendChild(_createButton(button))\n })\n\n this.addListeners()\n\n return this\n }\n\n addListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n let context\n let command\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n if (isString(listener)) {\n command = listener\n action.handler = function () {\n publish(command, button.name)\n }\n listener = action.handler\n }\n\n type = action.type || 'click'\n context = action.context\n }\n\n if (isFunction(listener)) {\n on($el, `.${button.name}`, type, listener, context || this, true)\n }\n })\n\n return this\n }\n\n removeListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n type = action.type || 'click'\n }\n\n if (isFunction(listener)) {\n off($el, type, listener)\n }\n })\n\n return this\n }\n}\n\nToolbar.DEFAULTS = {\n placement: 'ltr',\n closed: false,\n disabled: false,\n rounded: true,\n buttons: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterDisabled: null,\n afterEnabled: null,\n beforeDestroy: null,\n afterDestroy: null\n}\n\nexport default Toolbar\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n let uuid = 0\n\n return (prefix) => {\n uuid += 1\n\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n }\n})()\n\nexport default guid\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题,并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - (必须)主题名称\n * @param {Function} handler - (必须)主题的处理器函数\n * @param {Object} [context] - (可选)指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n const token = guid()\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n if (!isFunction(handler)) {\n return ''\n }\n\n /* istanbul ignore else */\n if (!_subscribers[subject]) {\n _subscribers[subject] = []\n }\n\n _subscribers[subject].push({\n topic: subject,\n callback: handler,\n context,\n token\n })\n\n return token\n}\n\nexport default on\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n if (!hasOwn(_subscribers, topic)) {\n return false\n }\n\n delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n if (!has(topic)) {\n return false\n }\n\n if (token) {\n _removeSubscriberByToken(token)\n } else {\n _removeSubscriber(topic)\n }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n const keys = Object.keys(_subscribers)\n let index = -1\n\n if (!token || keys.length < 1) {\n return false\n }\n\n keys.forEach((subject) => {\n const subscriber = _subscribers[subject]\n let topic\n\n subscriber.forEach((execution, j) => {\n if (execution.callback === token || execution.token === token) {\n topic = execution.topic\n subscriber.splice(index, j)\n }\n })\n\n /* istanbul ignore else */\n if (subscriber.length < 1) {\n _removeSubscriber(topic)\n }\n })\n}\n\nexport default _removeSubscriberByToken\n","import Base from './base'\nimport Anchors from './anchors'\nimport Drawer from './drawer'\nimport Chapters from './chapters'\nimport Toolbar from './toolbar'\n\nimport later from './utils/lang/later'\nimport isFunction from './utils/types/isFunction'\nimport isString from './utils/types/isString'\nimport isElement from './utils/types/isElement'\nimport addClass from './utils/dom/addClass'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport subscribe from './utils/observer/on'\nimport unsubscribe from './utils/observer/off'\n\nimport print from './print'\n\nclass Outline extends Base {\n constructor(options) {\n super()\n\n this.attrs = Outline.DEFAULTS\n this.anchors = null\n this.drawer = null\n this.chapters = null\n this.toolbar = null\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n this.attr(options).render().addListeners()\n return this\n }\n\n getChapters(isTreeStructured = false) {\n return this.anchors.getChapters(isTreeStructured)\n }\n\n count() {\n return this.anchors.count()\n }\n\n render() {\n const scrollElement = this.attr('scrollElement')\n const $scrollElement =\n document.querySelector(scrollElement) ||\n document.getElementById(scrollElement)\n\n this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar()\n\n if ($scrollElement) {\n this.onToolbarUpdate({\n top: $scrollElement.scrollTop,\n min: 0,\n max: $scrollElement.scrollHeight\n })\n }\n\n return this\n }\n\n _renderPrint() {\n const option = this.attr('print')\n const articleElement = this.attr('articleElement')\n let $articleElement\n\n if (!option.element) {\n return this\n }\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n addClass($articleElement, 'outline-article')\n print(option.element, option.title)\n\n return this\n }\n\n _renderAnchors() {\n const articleElement = this.attr('articleElement')\n const selector = this.attr('selector')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const chapterTextFilter = this.attr('chapterTextFilter')\n\n this.anchors = new Anchors({\n articleElement,\n stickyHeight,\n scrollElement,\n selector,\n showCode,\n anchorURL,\n afterScroll,\n chapterTextFilter\n })\n\n return this\n }\n\n _renderChapters() {\n const title = this.attr('title')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const customClass = this.attr('customClass')\n const showCode = this.attr('showCode')\n const position = this.attr('position')\n const placement = this.attr('placement')\n const afterSticky = this.attr('afterSticky')\n const afterToggle = this.attr('afterToggle')\n const afterScroll = this.attr('afterScroll')\n const count = this.count()\n let parentElement = this.attr('parentElement')\n let CHAPTERS_OPTIONS\n\n if (count < 1) {\n return this\n }\n\n CHAPTERS_OPTIONS = {\n scrollElement,\n showCode,\n position,\n title,\n stickyHeight,\n chapters: this.getChapters(),\n afterSticky,\n afterToggle,\n afterScroll\n }\n\n if (position === 'relative') {\n this.drawer = new Drawer({\n placement,\n title,\n size: 'tiny',\n hasOffset: true,\n hasPadding: false,\n customClass,\n afterClosed: () => {\n const toolbar = this.toolbar\n toolbar.toggle()\n }\n })\n parentElement = this.drawer.$main\n } else {\n CHAPTERS_OPTIONS.customClass = customClass\n }\n\n CHAPTERS_OPTIONS.parentElement = parentElement\n this.chapters = new Chapters(CHAPTERS_OPTIONS)\n\n return this\n }\n\n _renderToolbar() {\n const placement = this.attr('placement')\n const homepage = this.attr('homepage')\n const git = this.attr('git')\n const tags = this.attr('tags')\n const issues = this.attr('issues')\n const tools = this.attr('tools')\n const count = this.count()\n const UP = {\n name: 'up',\n icon: 'up',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:up'\n }\n }\n const HOME = {\n name: 'homepage',\n icon: 'homepage',\n size: 20,\n link: homepage\n }\n const GIT = {\n name: 'github',\n icon: 'github',\n size: 20,\n link: git\n }\n const TAGS = {\n name: 'tags',\n icon: 'tags',\n size: 20,\n link: tags\n }\n const ISSUES = {\n name: 'issues',\n icon: 'issues',\n size: 20,\n link: issues\n }\n const MENU = {\n name: 'menu',\n icon: 'menu',\n size: 18,\n action: {\n type: 'click',\n handler: 'toolbar:action:toggle'\n }\n }\n const DOWN = {\n name: 'down',\n icon: 'down',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:down'\n }\n }\n const buttons = []\n\n buttons.push(UP)\n if (count > 0) {\n buttons.push(MENU)\n }\n if (homepage) {\n buttons.push(HOME)\n }\n if (git) {\n buttons.push(GIT)\n }\n if (tags) {\n buttons.push(TAGS)\n }\n if (issues) {\n buttons.push(ISSUES)\n }\n if (tools?.length > 0) {\n buttons.push(...tools)\n }\n buttons.push(DOWN)\n this.buttons = [...buttons]\n\n this.toolbar = new Toolbar({\n placement,\n buttons: buttons\n })\n\n return this\n }\n\n addButton(button) {\n const toolbar = this.toolbar\n const buttons = this.buttons\n buttons.splice(-1, 0, button)\n toolbar.attr({\n buttons\n })\n toolbar.refresh()\n return this\n }\n\n removeButton(name) {\n this.toolbar.remove(name)\n return this\n }\n\n toTop() {\n const afterScroll = this.attr('afterScroll')\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const afterTop = () => {\n toolbar.hide('up')\n toolbar.show('down')\n\n if (count > 0) {\n chapters.highlight(0)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'up')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(0, afterTop)\n\n return this\n }\n\n toBottom() {\n const afterScroll = this.attr('afterScroll')\n const $scrollElement = _getScrollElement(this.attr('scrollElement'))\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const top = Math.floor(\n $scrollElement.scrollHeight - $scrollElement.clientHeight\n )\n const afterDown = () => {\n toolbar.hide('down')\n toolbar.show('up')\n\n if (count > 0) {\n chapters.highlight(count - 1)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'bottom')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(top, afterDown)\n\n return this\n }\n\n scrollTo(top, afterScroll) {\n const scrollElement = this.attr('scrollElement')\n scrollTo(scrollElement, top, afterScroll)\n return this\n }\n\n toggle() {\n const position = this.attr('position')\n const toolbar = this.toolbar\n const drawer = this.drawer\n const chapters = this.chapters\n const count = this.count()\n\n if (count < 1) {\n return this\n }\n\n if (position !== 'relative') {\n chapters.toggle()\n toolbar.highlight('menu')\n } else {\n toolbar.toggle()\n\n later(() => {\n if (chapters.isInside()) {\n chapters.toggle()\n } else {\n drawer.toggle()\n }\n })\n }\n\n return this\n }\n\n destroy() {\n let anchors = this.anchors\n let chapters = this.chapters\n let drawer = this.drawer\n let toolbar = this.toolbar\n let isOutside = false\n const count = this.count()\n\n this.removeListeners()\n\n if (count > 0) {\n isOutside = chapters.isOutside()\n\n chapters.destroy()\n chapters = null\n\n if (isOutside) {\n drawer.destroy()\n drawer = null\n }\n }\n\n toolbar.destroy()\n toolbar = null\n\n anchors.destroy()\n anchors = null\n\n this.attr(Outline.DEFAULTS)\n\n return this\n }\n\n onToggle() {\n this.toggle()\n return this\n }\n\n onScrollTop() {\n this.toTop()\n return this\n }\n\n onScrollBottom() {\n this.toBottom()\n return this\n }\n\n onToolbarUpdate({ top, min, max }) {\n const toolbar = this.toolbar\n const current = Math.ceil(top)\n\n if (current <= min) {\n toolbar.hide('up')\n toolbar.show('down')\n } else if (current >= max) {\n toolbar.hide('down')\n toolbar.show('up')\n } else if (current > min && current < max) {\n toolbar.show('up')\n toolbar.show('down')\n }\n\n return this\n }\n\n addListeners() {\n subscribe('toolbar:update', this.onToolbarUpdate, this)\n subscribe('toolbar:action:up', this.onScrollTop, this)\n subscribe('toolbar:action:toggle', this.onToggle, this)\n subscribe('toolbar:action:down', this.onScrollBottom, this)\n return this\n }\n\n removeListeners() {\n unsubscribe('toolbar:update')\n unsubscribe('toolbar:action:up')\n unsubscribe('toolbar:action:toggle')\n unsubscribe('toolbar:action:down')\n return this\n }\n}\n\nOutline.DEFAULTS = {\n articleElement: '#article',\n selector: 'h2,h3,h4,h5,h6',\n title: '目录',\n scrollElement: 'html,body',\n position: 'relative',\n parentElement: '#aside',\n placement: 'rtl',\n showCode: true,\n anchorURL: '',\n stickyHeight: 0,\n homepage: '',\n git: '',\n tags: '',\n issues: '',\n tools: [],\n print: {\n element: '',\n title: ''\n },\n customClass: '',\n afterSticky: null,\n afterToggle: null,\n afterScroll: null,\n chapterTextFilter: null\n}\n\nif (window.jQuery) {\n // 将 Outline 扩展为一个 jquery 插件\n // eslint-disable-next-line no-undef\n jQuery.extend(jQuery.fn, {\n outline: function (options) {\n // eslint-disable-next-line no-undef\n let $article = jQuery(this)\n\n return new Outline(\n // eslint-disable-next-line no-undef\n jQuery.extend({}, options, {\n articleElement: $article\n })\n )\n }\n })\n}\n\nexport default Outline\n","import isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport later from './utils/lang/later'\r\n\r\nconst print = (origins, title) => {\r\n let $origins\r\n let $article\r\n let $title\r\n let $sibling\r\n let tagName\r\n let text = title\r\n\r\n if (isString(origins)) {\r\n $origins =\r\n document.querySelector(origins) || document.getElementById(origins)\r\n } else {\r\n if (isElement(origins)) {\r\n $origins = origins\r\n }\r\n }\r\n\r\n $title = $origins.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n text = $title.innerText\r\n }\r\n\r\n $article = createElement(\r\n 'article',\r\n {\r\n className: 'outline-print'\r\n },\r\n ['']\r\n )\r\n $article.innerHTML = $origins.innerHTML\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-print__title'\r\n },\r\n [text]\r\n )\r\n\r\n $article.insertBefore($title, $article.firstChild)\r\n\r\n document.body.appendChild($article)\r\n\r\n later(() => {\r\n $sibling = $article.previousElementSibling\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-print_sibling')\r\n }\r\n $sibling = $sibling.previousElementSibling\r\n }\r\n\r\n $sibling = $article.nextElementSibling\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-print_sibling')\r\n }\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }, 350)\r\n}\r\n\r\nexport default print\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","offsetTop","el","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","stopPropagation","preventDefault","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","isArray","Array","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","exec","iconName","getSymbol","paint","$body","body","$icons","symbols","add","innerHTML","join","createElement","insertBefore","firstChild","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","className","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","isSVG","pattern","RegExp","test","icon","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","hasClass","allClass","classList","contains","removeClass","remove","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","chapterTextFilter","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","id","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","anchorURL","chapterCode","headingId","href","_updateHeading","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","publish","min","addClass","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","Chapters","$list","$placeholder","$parentElement","active","offsetWidth","$active","scrollTimer","resizeTimer","playing","Observer","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","contents","calculateStickyHeight","console","time","byId","chapter","$text","$link","$code","$li","$ul","_paintChapters","positionPlaceholder","timeEnd","sticky","onObserver","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","highlight","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","Math","window","innerHeight","show","FOLDED","HIDDEN","hide","clearTimeout","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","option","ACTIVE","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","guid","uuid","prefix","token","subject","_removeSubscriber","execution","j","_removeSubscriberByToken","Outline","anchors","drawer","toolbar","getElementById","_renderPrint","_renderAnchors","_renderChapters","_renderToolbar","onToolbarUpdate","element","origins","$origins","$article","$sibling","innerText","previousElementSibling","nextElementSibling","print","CHAPTERS_OPTIONS","homepage","git","tags","issues","tools","HOME","GIT","TAGS","ISSUES","MENU","addButton","removeButton","toTop","toBottom","floor","onToggle","onScrollTop","onScrollBottom","ceil","subscribe","unsubscribe","jQuery","extend","outline"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"outline.min.js","sources":["../../src/utils/types/isString.js","../../src/utils/lang/hasOwn.js","../../src/utils/lang/toString.js","../../src/utils/types/isFunction.js","../../src/utils/types/isObject.js","../../src/base.js","../../src/utils/lang/extend.js","../../src/utils/types/isElement.js","../../src/utils/lang/later.js","../../src/utils/lang/easeInQuad.js","../../src/utils/dom/_getScrollElement.js","../../src/utils/dom/scrollTo.js","../../src/utils/dom/offsetTop.js","../../src/utils/dom/matches.js","../../src/utils/dom/getParentOrHost.js","../../src/utils/event/enum.js","../../src/utils/event/_off.js","../../src/utils/event/_delete.js","../../src/utils/event/purgeElement.js","../../src/utils/event/getListeners.js","../../src/utils/event/off.js","../../src/utils/event/on.js","../../src/utils/event/getTarget.js","../../src/utils/dom/resolveTextNode.js","../../src/utils/dom/closest.js","../../src/utils/event/stop.js","../../src/utils/observer/_subscribers.js","../../src/utils/observer/_hasDirectSubscribersFor.js","../../src/utils/observer/has.js","../../src/utils/observer/_hasSubscribers.js","../../src/utils/observer/emit.js","../../src/utils/types/isTypedArray.js","../../src/utils/types/isArray.js","../../src/utils/icons/symbols.js","../../src/utils/icons/defaults.js","../../src/utils/icons/getSymbols.js","../../src/utils/icons/getSymbol.js","../../src/utils/icons/paint.js","../../src/utils/icons/add.js","../../src/utils/lang/trim.js","../../src/utils/types/isDOM.js","../../src/utils/types/isHTMLCollection.js","../../src/utils/types/isFragment.js","../../src/utils/types/isTextNode.js","../../src/utils/dom/setAttribute.js","../../src/utils/dom/createElement.js","../../src/utils/types/isSVG.js","../../src/utils/icons/icon.js","../../src/utils/icons/createElement.js","../../src/utils/dom/hasClass.js","../../src/utils/dom/removeClass.js","../../src/_resetHeading.js","../../src/utils/types/isEmpty.js","../../src/getChapters.js","../../src/utils/lang/stripTags.js","../../src/_getChapterParentIdByDiffer.js","../../src/_getChaptersWithCode.js","../../src/anchors.js","../../src/utils/lang/toTree.js","../../src/_updateHeading.js","../../src/utils/dom/addClass.js","../../src/utils/dom/setProperty.js","../../src/zIndex.js","../../src/drawer.js","../../src/utils/event/at.js","../../src/utils/dom/getStyle.js","../../src/chapters.js","../../src/_paintChapters.js","../../src/utils/dom/intersection.js","../../src/_createButton.js","../../src/toolbar.js","../../src/utils/lang/guid.js","../../src/utils/observer/on.js","../../src/utils/observer/_removeSubscriber.js","../../src/utils/observer/off.js","../../src/utils/observer/_removeSubscriberByToken.js","../../src/outline.js","../../src/print.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from '../types/isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n let $rootElements\n let $scrollElement\n\n if (!scrollElement) {\n $rootElements = document.querySelectorAll('html,body')\n $scrollElement =\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n ? $rootElements[0]\n : $rootElements[1]\n } else {\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n }\n\n return $scrollElement\n}\n\nexport default _getScrollElement\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n const $scrollElement = _getScrollElement(scrollElement)\n let scrollTop = $scrollElement.scrollTop\n let step = 0\n const distance = top - scrollTop\n const MAX_HEIGHT = $scrollElement.scrollHeight\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n const stop = (top) => {\n if (isFunction(afterStop)) {\n afterStop(top)\n }\n\n return false\n }\n const play = () => {\n step += 1\n\n // 向上滚动\n if (distance < 0) {\n scrollTop -= easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop <= top) {\n $scrollElement.scrollTop = top\n return stop(top)\n }\n } else {\n scrollTop += easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop >= MAX_TOP) {\n $scrollElement.scrollTop = MAX_TOP\n return stop(MAX_TOP)\n }\n }\n\n requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} data - (必须)数据对象\n * @param {Boolean} async - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg =\n `` +\n `` +\n ``\n }\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n if (isSVG(name)) {\n $svg = $icon.querySelector('svg')\n $svg.setAttribute('aria-hidden', 'true')\n $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n $svg.setAttribute('class', 'outline-icon__svg')\n $svg.setAttribute('width', '200')\n $svg.setAttribute('height', '200')\n $svg.style.cssText = cssRules\n }\n\n return $icon\n}\n\nexport default createElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import removeClass from './utils/dom/removeClass'\nimport isEmpty from './utils/types/isEmpty'\nimport trim from './utils/lang/trim'\n\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\n let $anchor\n\n $heading.innerHTML = text.replace(pattern, '')\n $heading.removeAttribute('id')\n $heading.removeAttribute('data-id')\n\n removeClass($heading, CLS_HEADING)\n\n if (!hasAnchor) {\n return false\n }\n\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\n\n if (isAtStart) {\n removeClass($heading, `${CLS_HEADING}_start`)\n }\n\n if (isEmpty(trim($heading.className))) {\n $heading.removeAttribute('class')\n }\n\n $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\n","import isString from './isString'\n/**\n * 检测数据是否为空字符串\n * ========================================================================\n * @method isEmpty\n * @param {String} str\n * @returns {boolean}\n */\nconst isEmpty = (str) => {\n return isString(str) && str === ''\n}\n\nexport default isEmpty\n","import trim from './utils/lang/trim'\nimport stripTags from './utils/lang/stripTags'\nimport isFunction from './utils/types/isFunction'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\n/**\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\n * ========================================================================\n * @method getChapters\n * @param {Array} headings\n * @param {Boolean} [showCode]\n * @param {Function} [chapterTextFilter]\n * @return {*|*[]}\n */\nconst getChapters = (headings, showCode = true, chapterTextFilter = null) => {\n let previous = 1\n let level = 0\n let text = ''\n const chapters = []\n\n headings.forEach((heading, i) => {\n const tagName = heading.tagName\n const headingLevel = tagName.replace(/h/i, '')\n let current = parseInt(headingLevel, 10)\n let pid = -1\n\n // 场景1:当前标题是前一个标题的子标题\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\n // h2 (前一个标题)\n // h3 (当前标题)\n if (current > previous) {\n level += 1\n\n // 第一层级的 pid 是 -1\n if (level === 1) {\n pid = -1\n } else {\n pid = i - 1\n }\n }\n // 场景2:当前标题和前一个标题层级相同\n // 当前标题的(标题标签)序号 = 前一个标题的序号\n // h2 (前一个标题)\n // h2 (当前标题)\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\n // h2\n // h4 (前一个标题)\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\n else if (current === previous || (current < previous && current > level)) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n pid = -1\n } else {\n pid = chapters[i - 1].pid\n }\n }\n // 场景3:当前标题比前一个标题层级高\n else if (current <= level) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n } else {\n level = level - (previous - current)\n\n if (level <= 1) {\n level = 1\n }\n }\n\n // 第一级的标题\n if (level === 1) {\n pid = -1\n } else {\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\n }\n }\n\n previous = current\n\n text = stripTags(trim(heading.innerHTML))\n\n if (isFunction(chapterTextFilter)) {\n text = chapterTextFilter(text)\n }\n\n chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text,\n tagName\n })\n })\n\n return showCode ? _getChaptersWithCode(chapters) : chapters\n}\n\nexport default getChapters\n","import isString from '../types/isString'\n\n/**\n * 过滤所有 HTML 标签\n * ========================================================================\n * @method stripTags\n * @param {string} str\n * @returns {string}\n */\nconst stripTags = (str) => {\n if (!isString(str)) {\n return ''\n }\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\n}\n\nexport default stripTags\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\n let previous = chapters[index - 1]\n let pid\n let i\n\n for (i = 0; i < differ; i += 1) {\n pid = previous.pid\n previous = chapters[pid]\n }\n\n pid = previous.pid\n\n return pid\n}\n\nexport default _getChapterParentIdByDiffer\n","import isArray from './utils/types/isArray'\n\nconst _getChaptersWithCode = (chapters) => {\n const groups = {}\n const cb = (o) => {\n return [o.pid]\n }\n\n chapters.forEach((o) => {\n const group = JSON.stringify(cb(o))\n\n groups[group] = groups[group] || []\n groups[group].push(o)\n\n o.index = groups[group].length\n if (o.pid === -1) {\n o.code = String(o.index)\n }\n })\n\n Object.keys(groups).forEach((group) => {\n groups[group].forEach((c) => {\n const subjects = groups[`[${c.id}]`]\n if (!subjects || !isArray(subjects)) {\n return false\n }\n subjects.forEach((o) => {\n o.code = c.code + '.' + o.index\n })\n })\n })\n\n return chapters\n}\n\nexport default _getChaptersWithCode\n","import Base from './base'\n\n// 在文章的标题生成 anchor 链接\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport toTree from './utils/lang/toTree'\nimport later from './utils/lang/later'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport offsetTop from './utils/dom/offsetTop'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport publish from './utils/observer/emit'\nimport paint from './utils/icons/paint'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n const showCode = this.attr('showCode') || true\n let created\n let scrollElement\n let selector\n let $articleElement\n let articleElement\n\n this.attr(options)\n articleElement = this.attr('articleElement')\n scrollElement = this.attr('scrollElement')\n selector = this.attr('selector')\n created = this.attr('created')\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n if (!$articleElement) {\n return this\n }\n\n this.$articleElement = $articleElement\n this.$scrollElement = _getScrollElement(scrollElement)\n this.$headings = [...$articleElement.querySelectorAll(selector)]\n\n if (this.$headings.length < 1) {\n return this\n }\n\n this.chapters = getChapters(\n this.$headings,\n showCode,\n this.attr('chapterTextFilter')\n )\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n getChapters(isTreeStructured = false) {\n const chapters = this.chapters\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\n }\n\n count() {\n return this.chapters.length\n }\n\n render() {\n const mounted = this.attr('mounted')\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const $headings = this.$headings\n const chapters = this.getChapters()\n\n paint()\n\n $headings.forEach(($heading, i) => {\n const chapterCode = chapters[i].code\n _updateHeading($heading, i, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n destroy() {\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n onAnchorTrigger(evt) {\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const $heading = $anchor.parentNode\n const top = offsetTop($heading) - (stickyHeight + 10)\n const $scrollElement = this.$scrollElement\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'anchor')\n }\n\n later(() => {\n publish('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.scrollTo(top, after)\n\n if (!anchorURL) {\n stop(evt)\n }\n\n return this\n }\n\n addListeners() {\n const $articleElement = this.$articleElement\n\n on(\n $articleElement,\n '.outline-heading__anchor',\n 'click',\n this.onAnchorTrigger,\n this,\n true\n )\n\n return this\n }\n\n removeListeners() {\n const $articleElement = this.$articleElement\n\n off($articleElement, 'click', this.onAnchorTrigger)\n\n return this\n }\n}\n\nAnchors.DEFAULTS = {\n scrollElement: 'html,body',\n articleElement: '#article',\n selector: 'h1,h2,h3,h4,h5,h6',\n stickyHeight: 0,\n anchorURL: '',\n hasAnchor: true,\n isAtStart: true,\n showCode: false,\n created: null,\n mounted: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n chapterTextFilter: null\n}\n\nexport default Anchors\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttribute from './utils/dom/setAttribute'\n\nimport icon from './utils/icons/icon'\n\nconst _updateHeading = ($heading, i, options) => {\n const $fragment = document.createDocumentFragment()\n const CLS_HEADING = 'outline-heading'\n const hasAnchor = options.hasAnchor || true\n const isAtStart = options.isAtStart || true\n const showCode = options.showCode || false\n const chapterCode = options.chapterCode || ''\n const anchorURL = options.anchorURL || ''\n const headingId = `heading-${i}`\n const attrs = {\n id: headingId,\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\n 'data-id': i\n }\n const keys = Object.keys(attrs)\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n keys.forEach((prop) => {\n setAttribute($heading, prop, attrs[prop])\n })\n\n if (showCode) {\n $heading.innerHTML = chapterCode + ' ' + text\n }\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = icon('hash', { iconSet: 'outline' })\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL || `#${headingId}`,\n target: anchorURL ? '_blank' : 'self',\n 'data-id': i\n },\n [$icon]\n )\n $fragment.appendChild($anchor)\n $heading.appendChild($fragment)\n}\n\nexport default _updateHeading\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\n\nlet index = 2000\n\nconst zIndex = (idx) => {\n if (idx) {\n index = idx\n } else {\n index += 1\n }\n\n setProperty('--outline-zIndex', `${index}`)\n\n return index\n}\n\nexport default zIndex\n","import Base from './base'\n\nimport later from './utils/lang/later'\nimport isFunction from './utils/types/isFunction'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport paint from './utils/icons/paint'\nimport icon from './utils/icons/icon'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = true\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n\n this.title = this.attr('title')\n created = this.attr('created')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n return this\n }\n\n setTitle(title) {\n this.attr('title', title)\n this.title = title\n this.$title.innerHTML = title\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n render() {\n const mounted = this.attr('mounted')\n const size = this.attr('size')\n const placement = this.attr('placement')\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const hasOffset = this.attr('hasOffset')\n const hasPadding = this.attr('hasPadding')\n const autoHeight = this.attr('autoHeight')\n const customClass = this.attr('customClass')\n let $el\n let $modal\n let $header\n let $title\n let $close\n let $main\n let $footer\n let $overlay\n\n paint()\n this.zIndex = zIndex()\n\n $title = createElement(\n 'h2',\n {\n className: 'outline-drawer__title'\n },\n [this.title]\n )\n this.$title = $title\n\n if (hasClose) {\n $close = createElement(\n 'div',\n {\n className: 'outline-drawer__close'\n },\n [icon('close', { size: 20 })]\n )\n this.$close = $close\n }\n\n $header = createElement(\n 'header',\n {\n className: 'outline-drawer__header'\n },\n [$title, $close]\n )\n this.$header = $header\n\n $main = createElement(\n 'div',\n {\n className: 'outline-drawer__main'\n },\n ['']\n )\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement(\n 'footer',\n {\n className: 'outline-drawer__footer'\n },\n ['']\n )\n this.$footer = $footer\n\n $modal = createElement(\n 'div',\n {\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\n },\n [$header, $main, $footer]\n )\n this.$modal = $modal\n\n if (hasOffset) {\n addClass($modal, 'outline-drawer_offset')\n }\n\n if (autoHeight) {\n addClass($modal, 'outline-drawer_auto')\n }\n\n if (customClass) {\n addClass($modal, customClass)\n }\n\n if (hasOverlay) {\n $overlay = createElement(\n 'div',\n {\n className: 'outline-drawer__overlay'\n },\n ['']\n )\n this.$overlay = $overlay\n }\n\n $el = createElement(\n 'div',\n {\n className: `outline-drawer`\n },\n [$modal, $overlay]\n )\n this.$el = $el\n document.body.appendChild($el)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n open() {\n const opened = this.attr('afterOpened')\n const $modal = this.$modal\n\n addClass(this.$el, 'outline-drawer_opened')\n removeClass($modal, 'outline-drawer_closed')\n addClass($modal, 'outline-drawer_opened')\n\n later(() => {\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n })\n\n return this\n }\n\n close() {\n const closed = this.attr('afterClosed')\n const $modal = this.$modal\n\n removeClass($modal, 'outline-drawer_opened')\n addClass($modal, 'outline-drawer_closed')\n\n later(() => {\n removeClass(this.$el, 'outline-drawer_opened')\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n })\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const closed = this.isClosed()\n\n if (closed) {\n this.open()\n } else {\n this.close()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n afterToggle.call(this, closed)\n })\n }\n\n return this\n }\n\n destroy() {\n const afterDestroy = this.attr('afterDestroy')\n const beforeDestroy = this.attr('beforeDestroy')\n let index = this.zIndex\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = false\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n\n index -= 1\n zIndex(index)\n this.zIndex = 0\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n addListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay) {\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (!hasClose && !hasOverlay) {\n return this\n }\n\n off($el, 'click', this.onClose)\n\n return this\n }\n\n onClose() {\n this.close()\n return this\n }\n}\n\nDrawer.DEFAULTS = {\n placement: 'rtl',\n title: '标题',\n size: 'regular',\n hasClose: true,\n hasOverlay: true,\n hasOffset: false,\n hasPadding: true,\n autoHeight: true,\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterToggle: null\n}\n\nexport default Drawer\n","import isFunction from '../types/isFunction'\nimport off from './off'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定事件\n * ========================================================================\n * @method at\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst at = (el, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n const listener = function (evt) {\n let overrideContext = context || el\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n\n if (!isFunction(fn)) {\n return false\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default at\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport later from './utils/lang/later'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport createElement from './utils/dom/createElement'\nimport scrollTo from './utils/dom/scrollTo'\nimport addClass from './utils/dom/addClass'\nimport intersection from './utils/dom/intersection'\nimport removeClass from './utils/dom/removeClass'\nimport offsetTop from './utils/dom/offsetTop'\nimport getStyle from './utils/dom/getStyle'\nimport setProperty from './utils/dom/setProperty'\nimport publish from './utils/observer/emit'\n\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = Chapters.DEFAULTS\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.chapters = []\n this.closed = false\n this.active = 0\n this.offsetTop = 0\n this.offsetWidth = 0\n this.$active = null\n this.scrollTimer = null\n this.resizeTimer = null\n this.playing = false\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n let parentElement\n let scrollElement\n let $parent\n\n this.attr(options)\n created = this.attr('created')\n parentElement = this.attr('parentElement')\n scrollElement = this.attr('scrollElement')\n\n if (isString(parentElement)) {\n $parent = document.querySelector(parentElement)\n } else if (isElement(parentElement)) {\n $parent = parentElement\n }\n this.$parentElement = $parent\n this.$scrollElement = _getScrollElement(scrollElement)\n\n this.chapters = this.attr('chapters')\n this.closed = this.attr('closed')\n this.active = this.attr('active')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n if (this.chapters.length < 1) {\n return this\n }\n\n this.render().addListeners()\n\n this.$active = document.querySelector(`#chapter-${this.active}`)\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n isSticky() {\n const position = this.attr('position')\n return position === 'sticky'\n }\n\n isFixed() {\n const position = this.attr('position')\n return position === 'fixed'\n }\n\n isInside() {\n return this.isFixed() || this.isSticky()\n }\n\n isOutside() {\n return !this.isInside()\n }\n\n _paintEdge() {\n const $fragment = document.createDocumentFragment()\n const STICKY = 'outline-chapters_sticky'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\n const contents = []\n let $title = null\n let $el\n let $main\n let $list\n let $placeholder\n\n if (!$parentElement) {\n return this\n }\n\n if (this.isInside() && title) {\n $title = createElement(\n 'h2',\n {\n className: 'outline-chapters__title'\n },\n [title]\n )\n this.$title = $title\n contents.push($title)\n }\n\n $list = createElement(\n 'ul',\n {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list`\n },\n ['']\n )\n this.$list = $list\n\n $placeholder = createElement(\n 'div',\n {\n className: 'outline-chapters__placeholder'\n },\n ['']\n )\n this.$placeholder = $placeholder\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n [$list, $placeholder]\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: `outline-chapters ${HIDDEN}`\n },\n contents\n )\n this.$el = $el\n\n if (this.isSticky()) {\n this.calculateStickyHeight()\n addClass($el, STICKY)\n }\n\n if (customClass) {\n addClass($el, customClass)\n }\n $fragment.appendChild($el)\n $parentElement.appendChild($fragment)\n\n return this\n }\n\n render() {\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n const chapters = this.chapters\n let $el\n let $list\n\n if (!$parentElement || chapters.length < 1) {\n return this\n }\n\n this._paintEdge()\n\n $el = this.$el\n $list = this.$list\n _paintChapters($list, chapters, showCode)\n removeClass($el, HIDDEN)\n this.positionPlaceholder(this.active)\n\n this.offsetTop = offsetTop($el)\n this.offsetWidth = $el.offsetWidth\n\n if (this.isFixed()) {\n this.sticky()\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n this.onObserver()\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\n const placeholderBorderTop = parseInt(\n getStyle($list, 'border-top-width'),\n 10\n )\n let height = $anchor.offsetHeight\n let offsetTop = 0\n let top\n\n if (mainPaddingTop) {\n offsetTop += mainPaddingTop\n }\n\n if (placeholderPaddingTop) {\n offsetTop += placeholderPaddingTop\n }\n\n if (placeholderMarginTop) {\n offsetTop += placeholderMarginTop\n }\n\n if (mainBorderTop) {\n offsetTop += mainBorderTop\n }\n\n if (placeholderBorderTop) {\n offsetTop += placeholderBorderTop\n }\n\n top = height * index\n // top:calc(${offsetTop}px + ${top}px);\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const HIGHLIGHT = 'outline-chapters_active'\n\n if (!$anchor) {\n return this\n }\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n this.$active = $anchor\n addClass(this.$active, HIGHLIGHT)\n\n this.positionPlaceholder(this.active)\n\n return this\n }\n\n sticky() {\n const afterSticky = this.attr('afterSticky')\n const FIXED = 'outline-chapters_fixed'\n const $el = this.$el\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (!this.isFixed()) {\n return this\n }\n\n isStickying = scrollTop >= top\n\n if (isStickying) {\n addClass($el, FIXED)\n } else {\n removeClass($el, FIXED)\n }\n\n if (isFunction(afterSticky)) {\n afterSticky.call(this, this.isClosed(), isStickying)\n }\n\n return this\n }\n\n calculateStickyHeight() {\n const documentElement = document.documentElement\n const height = Math.max(\n documentElement.clientHeight || 0,\n window.innerHeight || 0\n )\n setProperty('--outline-sticky-height', `${height}px`)\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n show() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const opened = this.attr('afterOpened')\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n removeClass($parent, HIDDEN)\n removeClass($el, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n removeClass($el, FOLDED)\n }, 30)\n } else {\n removeClass($el, HIDDEN)\n }\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n\n return this\n }\n\n hide() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const closed = this.attr('afterClosed')\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n addClass($parent, FOLDED)\n addClass($el, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n addClass($el, HIDDEN)\n })\n } else {\n addClass($el, HIDDEN)\n }\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n isStickying = scrollTop >= top\n afterToggle.call(this, this.isClosed(), isStickying)\n })\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.$active = null\n this.closed = false\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n this.scrollTimer = null\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n this.resizeTimer = null\n }\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\n\n this.Observer = intersection(\n ($heading) => {\n const id = $heading.getAttribute('data-id')\n\n if (this.playing) {\n return false\n }\n\n if (timer) {\n clearTimeout(timer)\n }\n\n timer = later(() => {\n this.highlight(id)\n }, 100)\n },\n {\n selector,\n context: this\n }\n )\n\n return this\n }\n\n onSelect(evt) {\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const id = $anchor.getAttribute('data-id')\n const headingId = $anchor.href.split('#')[1]\n const $heading = document.querySelector(`#${headingId}`)\n const top = offsetTop($heading) - (stickyHeight + 10)\n const min = 0\n const max = this.$scrollElement.scrollHeight\n const afterScroll = this.attr('afterScroll')\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'chapter')\n }\n\n later(() => {\n this.playing = false\n publish('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.playing = true\n if (this.isFixed()) {\n this.sticky()\n later(() => {\n this.scrollTo(top, after)\n this.highlight(id)\n }, 10)\n } else {\n this.scrollTo(top, after)\n this.highlight(id)\n }\n\n stop(evt)\n\n return this\n }\n\n onScroll() {\n const $scrollElement = this.$scrollElement\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n }\n\n this.scrollTimer = later(() => {\n const top = $scrollElement.scrollTop\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n\n if (this.isFixed()) {\n this.sticky()\n }\n\n publish('toolbar:update', {\n top,\n min,\n max\n })\n }, 100)\n\n return this\n }\n\n onResize() {\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n }\n\n this.resizeTimer = later(() => {\n this.calculateStickyHeight()\n })\n\n return this\n }\n\n addListeners() {\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\n at($element, 'scroll', this.onScroll, this, true)\n if (this.isSticky()) {\n at($element, 'resize', this.onResize, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const selector = this.attr('selector')\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n off($el, 'click', this.onSelect)\n off($element, 'scroll', this.onScroll)\n\n if (this.isSticky()) {\n at($element, 'resize', this.onResize)\n }\n\n if (this.Observer) {\n document.querySelectorAll(selector).forEach((section) => {\n this.Observer.unobserve(section)\n })\n }\n\n return this\n }\n}\n\nChapters.DEFAULTS = {\n parentElement: '',\n scrollElement: '',\n selector: '.outline-heading',\n active: 0,\n closed: false,\n showCode: true,\n position: 'relative',\n stickyHeight: 0,\n chapters: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterSticky: null\n}\n\nexport default Chapters\n","import createElement from './utils/dom/createElement'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const byId = (id) => document.querySelector(`#${id}`)\n\n chapters.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n [chapter.text]\n )\n const $link = createElement(\n 'a',\n {\n id: `chapter__anchor-${id}`,\n className: 'outline-chapters__anchor',\n href: '#' + rel,\n rel: rel,\n 'data-id': id\n },\n [$text]\n )\n let $code\n let $li\n let $ul\n let $parent\n\n if (showCode) {\n $code = createElement(\n 'span',\n {\n className: 'outline-chapters__code',\n 'data-id': id\n },\n [chapter.code]\n )\n\n $link.insertBefore($code, $link.firstChild)\n }\n\n $li = createElement(\n 'li',\n {\n id: `chapter-${id}`,\n className: 'outline-chapters__item',\n 'data-id': id\n },\n [$link]\n )\n\n if (pid === -1) {\n $list.appendChild($li)\n } else {\n $parent = byId(`chapter-${pid}`)\n $ul = byId(`subject-${pid}`)\n\n if (!$ul) {\n $ul = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n [$li]\n )\n\n $parent.appendChild($ul)\n } else {\n $ul.appendChild($li)\n }\n }\n })\n}\n\nexport default _paintChapters\n","import isFunction from '../types/isFunction'\nimport isElement from '../types/isElement'\n\n/**\n * 通用的 IntersectionObserver 观察者处理器\n * ========================================================================\n * @method intersection\n * @param {Function} fn\n * @param {Object} [props]\n * @param {Object|HTMLElement} [props.root]\n * @param {String} [props.selector]\n * @param {Object} [props.context]\n * @param {String} [props.attr]\n * @param {String} [props.rootMargin]\n */\nconst intersection = (fn, props = {}) => {\n const root = props.root || null\n const selector = props.selector || '.outline-heading'\n const context = props.context || null\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\n const options = {\n rootMargin: rootMargin\n }\n const Observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.intersectionRatio > 0) {\n if (isFunction(fn)) {\n fn.call(context || entry.target, entry.target)\n }\n }\n })\n }, options)\n const $root = isElement(root) ? root : document\n\n if (root) {\n options.root = root\n }\n\n $root.querySelectorAll(selector).forEach((section) => {\n Observer.observe(section)\n })\n\n return Observer\n}\n\nexport default intersection\n","import icon from './utils/icons/icon'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = icon(button.icon, {\n iconSet: button.iconSet || 'outline',\n color: button.color || '',\n size: button.size\n })\n const $anchor = createElement(\n 'a',\n {\n className: `outline-toolbar__anchor`,\n href: button.link\n },\n [$icon]\n )\n const $button = createElement(\n 'div',\n {\n className: `outline-toolbar__button ${button.name}`\n },\n [button.link ? $anchor : $icon]\n )\n\n addClass($icon, 'outline-toolbar__icon')\n\n if (rounded) {\n addClass($button, 'outline-toolbar_rounded')\n }\n\n if (button.disabled) {\n addClass($button, 'outline-toolbar_disabled')\n }\n\n return $button\n}\n\nexport default _createButton\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isObject from './utils/types/isObject'\nimport isArray from './utils/types/isArray'\nimport later from './utils/lang/later'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\nimport hasClass from './utils/dom/hasClass'\nimport removeClass from './utils/dom/removeClass'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport publish from './utils/observer/emit'\nimport paint from './utils/icons/paint'\n\nimport _createButton from './_createButton'\n\nconst DISABLED = 'outline-toolbar_disabled'\nconst HIDDEN = 'outline-toolbar_hidden'\n\nclass Toolbar extends Base {\n constructor(options) {\n super()\n\n this.attrs = Toolbar.DEFAULTS\n this.$el = null\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n created = this.attr('created')\n this.disabled = this.attr('disabled')\n this.closed = this.attr('closed')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n isDisabled(name) {\n const buttons = this.attr('buttons')\n let button\n\n if (name) {\n button = buttons.find((option) => option.name === name)\n\n return button?.disabled\n }\n\n return this.disabled\n }\n\n isClosed() {\n return this.closed\n }\n\n highlight(name) {\n const button = this.buttons.find((item) => item.name === name)\n const ACTIVE = 'outline-toolbar_active'\n let $button\n\n if ($button) {\n return this\n }\n\n $button = button.$el\n\n if (hasClass($button, ACTIVE)) {\n removeClass($button, ACTIVE)\n } else {\n addClass($button, ACTIVE)\n }\n\n return this\n }\n\n render() {\n const mounted = this.attr('mounted')\n const buttons = this.attr('buttons') || []\n const rounded = this.attr('rounded')\n const placement = this.attr('placement')\n const $buttons = document.createDocumentFragment()\n const $fragment = document.createDocumentFragment()\n\n paint()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $buttons.appendChild($button)\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el = createElement(\n 'div',\n {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n },\n [$buttons]\n )\n $fragment.appendChild(this.$el)\n document.body.appendChild($fragment)\n\n if (this.closed) {\n this.hide()\n }\n\n if (this.disabled) {\n this.disable()\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n add(button) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const action = button.action\n const $fragment = document.createDocumentFragment()\n let type\n\n if (isObject(button)) {\n buttons.push(button)\n $fragment.appendChild(_createButton(button))\n } else if (isArray(button)) {\n button.forEach((item) => {\n $fragment.appendChild(_createButton(item))\n })\n }\n $el.appendChild($fragment)\n\n if (action && isFunction(action.handler)) {\n type = action.type || 'click'\n on($el, `.${button.name}`, type, action.handler)\n }\n\n return this\n }\n\n remove(name) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let index = -1\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((button, i) => {\n if (button.name === name) {\n index = i\n }\n })\n\n if (index > -1) {\n this.attr().buttons.splice(index, 1)\n }\n\n $button = $el.querySelector(`.${name}`)\n this.switch(name, false)\n $el.removeChild($button)\n\n return this\n }\n\n switch(name, enabled) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let action\n let type\n let listener\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((option) => {\n if (option.name === name) {\n button.disabled = !enabled\n }\n })\n\n action = button.action\n $button = $el.querySelector(`.${name}`)\n\n if (action) {\n type = action.type || 'click'\n listener = action.handler\n }\n\n if (enabled) {\n removeClass($button, DISABLED)\n\n if (type && listener) {\n on($el, `.${name}`, type, listener)\n }\n } else {\n addClass($button, DISABLED)\n\n if (type && listener) {\n off($el, type, listener)\n }\n }\n\n return this\n }\n\n disable(name) {\n const disabled = this.attr('afterDisabled')\n\n if (name) {\n this.switch(name, false)\n } else {\n addClass(this.$el, DISABLED)\n this.removeListeners()\n this.disabled = true\n\n if (isFunction(disabled)) {\n disabled.call(this)\n }\n }\n\n return this\n }\n\n enable(name) {\n const enabled = this.attr('afterEnabled')\n\n if (name) {\n this.switch(name, true)\n } else {\n this.disabled = false\n removeClass(this.$el, DISABLED)\n this.addListeners()\n\n if (isFunction(enabled)) {\n enabled.call(this)\n }\n }\n\n return this\n }\n\n show(name) {\n const opened = this.attr('afterOpened')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n\n $button = $el.querySelector(`.${name}`)\n removeClass($button, HIDDEN)\n } else {\n removeClass($el, HIDDEN)\n this.closed = false\n\n if (isFunction(opened)) {\n later(() => {\n opened.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n hide(name) {\n const closed = this.attr('afterClosed')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n $button = $el.querySelector(`.${name}`)\n addClass($button, HIDDEN)\n } else {\n addClass($el, HIDDEN)\n this.closed = true\n\n if (isFunction(closed)) {\n later(() => {\n closed.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n toggle() {\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n let $el = this.$el\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n document.body.removeChild($el)\n $el = null\n\n this.attr(Toolbar.DEFAULTS)\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n refresh() {\n const $el = this.$el\n const buttons = this.attr('buttons') || []\n\n this.removeListeners()\n $el.innerHTML = ''\n\n buttons.forEach((button) => {\n this.$el.appendChild(_createButton(button))\n })\n\n this.addListeners()\n\n return this\n }\n\n addListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n let context\n let command\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n if (isString(listener)) {\n command = listener\n action.handler = function () {\n publish(command, button.name)\n }\n listener = action.handler\n }\n\n type = action.type || 'click'\n context = action.context\n }\n\n if (isFunction(listener)) {\n on($el, `.${button.name}`, type, listener, context || this, true)\n }\n })\n\n return this\n }\n\n removeListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n type = action.type || 'click'\n }\n\n if (isFunction(listener)) {\n off($el, type, listener)\n }\n })\n\n return this\n }\n}\n\nToolbar.DEFAULTS = {\n placement: 'ltr',\n closed: false,\n disabled: false,\n rounded: true,\n buttons: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterDisabled: null,\n afterEnabled: null,\n beforeDestroy: null,\n afterDestroy: null\n}\n\nexport default Toolbar\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n let uuid = 0\n\n return (prefix) => {\n uuid += 1\n\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n }\n})()\n\nexport default guid\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题,并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - (必须)主题名称\n * @param {Function} handler - (必须)主题的处理器函数\n * @param {Object} [context] - (可选)指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n const token = guid()\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n if (!isFunction(handler)) {\n return ''\n }\n\n /* istanbul ignore else */\n if (!_subscribers[subject]) {\n _subscribers[subject] = []\n }\n\n _subscribers[subject].push({\n topic: subject,\n callback: handler,\n context,\n token\n })\n\n return token\n}\n\nexport default on\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n if (!hasOwn(_subscribers, topic)) {\n return false\n }\n\n delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n if (!has(topic)) {\n return false\n }\n\n if (token) {\n _removeSubscriberByToken(token)\n } else {\n _removeSubscriber(topic)\n }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n const keys = Object.keys(_subscribers)\n let index = -1\n\n if (!token || keys.length < 1) {\n return false\n }\n\n keys.forEach((subject) => {\n const subscriber = _subscribers[subject]\n let topic\n\n subscriber.forEach((execution, j) => {\n if (execution.callback === token || execution.token === token) {\n topic = execution.topic\n subscriber.splice(index, j)\n }\n })\n\n /* istanbul ignore else */\n if (subscriber.length < 1) {\n _removeSubscriber(topic)\n }\n })\n}\n\nexport default _removeSubscriberByToken\n","import Base from './base'\nimport Anchors from './anchors'\nimport Drawer from './drawer'\nimport Chapters from './chapters'\nimport Toolbar from './toolbar'\n\nimport later from './utils/lang/later'\nimport isFunction from './utils/types/isFunction'\nimport isString from './utils/types/isString'\nimport isElement from './utils/types/isElement'\nimport addClass from './utils/dom/addClass'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport subscribe from './utils/observer/on'\nimport unsubscribe from './utils/observer/off'\n\nimport print from './print'\n\nclass Outline extends Base {\n constructor(options) {\n super()\n\n this.attrs = Outline.DEFAULTS\n this.anchors = null\n this.drawer = null\n this.chapters = null\n this.toolbar = null\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n this.attr(options).render().addListeners()\n return this\n }\n\n getChapters(isTreeStructured = false) {\n return this.anchors.getChapters(isTreeStructured)\n }\n\n count() {\n return this.anchors.count()\n }\n\n render() {\n const scrollElement = this.attr('scrollElement')\n const $scrollElement =\n document.querySelector(scrollElement) ||\n document.getElementById(scrollElement)\n\n this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar()\n\n if ($scrollElement) {\n this.onToolbarUpdate({\n top: $scrollElement.scrollTop,\n min: 0,\n max: $scrollElement.scrollHeight\n })\n }\n\n return this\n }\n\n _renderPrint() {\n const option = this.attr('print')\n const articleElement = this.attr('articleElement')\n let $articleElement\n\n if (!option.element) {\n return this\n }\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n addClass($articleElement, 'outline-article')\n print(option.element, option.title)\n\n return this\n }\n\n _renderAnchors() {\n const articleElement = this.attr('articleElement')\n const selector = this.attr('selector')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const chapterTextFilter = this.attr('chapterTextFilter')\n\n this.anchors = new Anchors({\n articleElement,\n stickyHeight,\n scrollElement,\n selector,\n showCode,\n anchorURL,\n afterScroll,\n chapterTextFilter\n })\n\n return this\n }\n\n _renderChapters() {\n const title = this.attr('title')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const customClass = this.attr('customClass')\n const showCode = this.attr('showCode')\n const position = this.attr('position')\n const placement = this.attr('placement')\n const afterSticky = this.attr('afterSticky')\n const afterToggle = this.attr('afterToggle')\n const afterScroll = this.attr('afterScroll')\n const count = this.count()\n let parentElement = this.attr('parentElement')\n let CHAPTERS_OPTIONS\n\n if (count < 1) {\n return this\n }\n\n CHAPTERS_OPTIONS = {\n scrollElement,\n showCode,\n position,\n title,\n stickyHeight,\n chapters: this.getChapters(),\n afterSticky,\n afterToggle,\n afterScroll\n }\n\n if (position === 'relative') {\n this.drawer = new Drawer({\n placement,\n title,\n size: 'tiny',\n hasOffset: true,\n hasPadding: false,\n customClass,\n afterClosed: () => {\n const toolbar = this.toolbar\n toolbar.toggle()\n }\n })\n parentElement = this.drawer.$main\n } else {\n CHAPTERS_OPTIONS.customClass = customClass\n }\n\n CHAPTERS_OPTIONS.parentElement = parentElement\n this.chapters = new Chapters(CHAPTERS_OPTIONS)\n\n return this\n }\n\n _renderToolbar() {\n const placement = this.attr('placement')\n const homepage = this.attr('homepage')\n const git = this.attr('git')\n const tags = this.attr('tags')\n const issues = this.attr('issues')\n const tools = this.attr('tools')\n const count = this.count()\n const UP = {\n name: 'up',\n icon: 'up',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:up'\n }\n }\n const HOME = {\n name: 'homepage',\n icon: 'homepage',\n size: 20,\n link: homepage\n }\n const GIT = {\n name: 'github',\n icon: 'github',\n size: 20,\n link: git\n }\n const TAGS = {\n name: 'tags',\n icon: 'tags',\n size: 20,\n link: tags\n }\n const ISSUES = {\n name: 'issues',\n icon: 'issues',\n size: 20,\n link: issues\n }\n const MENU = {\n name: 'menu',\n icon: 'menu',\n size: 18,\n action: {\n type: 'click',\n handler: 'toolbar:action:toggle'\n }\n }\n const DOWN = {\n name: 'down',\n icon: 'down',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:down'\n }\n }\n const buttons = []\n\n buttons.push(UP)\n if (count > 0) {\n buttons.push(MENU)\n }\n if (homepage) {\n buttons.push(HOME)\n }\n if (git) {\n buttons.push(GIT)\n }\n if (tags) {\n buttons.push(TAGS)\n }\n if (issues) {\n buttons.push(ISSUES)\n }\n if (tools?.length > 0) {\n buttons.push(...tools)\n }\n buttons.push(DOWN)\n this.buttons = [...buttons]\n\n this.toolbar = new Toolbar({\n placement,\n buttons: buttons\n })\n\n return this\n }\n\n addButton(button) {\n const toolbar = this.toolbar\n const buttons = this.buttons\n buttons.splice(-1, 0, button)\n toolbar.attr({\n buttons\n })\n toolbar.refresh()\n return this\n }\n\n removeButton(name) {\n this.toolbar.remove(name)\n return this\n }\n\n toTop() {\n const afterScroll = this.attr('afterScroll')\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const afterTop = () => {\n toolbar.hide('up')\n toolbar.show('down')\n\n if (count > 0) {\n chapters.highlight(0)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'up')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(0, afterTop)\n\n return this\n }\n\n toBottom() {\n const afterScroll = this.attr('afterScroll')\n const $scrollElement = _getScrollElement(this.attr('scrollElement'))\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const top = Math.floor(\n $scrollElement.scrollHeight - $scrollElement.clientHeight\n )\n const afterDown = () => {\n toolbar.hide('down')\n toolbar.show('up')\n\n if (count > 0) {\n chapters.highlight(count - 1)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'bottom')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(top, afterDown)\n\n return this\n }\n\n scrollTo(top, afterScroll) {\n const scrollElement = this.attr('scrollElement')\n scrollTo(scrollElement, top, afterScroll)\n return this\n }\n\n toggle() {\n const position = this.attr('position')\n const toolbar = this.toolbar\n const drawer = this.drawer\n const chapters = this.chapters\n const count = this.count()\n\n if (count < 1) {\n return this\n }\n\n if (position !== 'relative') {\n chapters.toggle()\n toolbar.highlight('menu')\n } else {\n toolbar.toggle()\n\n later(() => {\n if (chapters.isInside()) {\n chapters.toggle()\n } else {\n drawer.toggle()\n }\n })\n }\n\n return this\n }\n\n destroy() {\n let anchors = this.anchors\n let chapters = this.chapters\n let drawer = this.drawer\n let toolbar = this.toolbar\n let isOutside = false\n const count = this.count()\n\n this.removeListeners()\n\n if (count > 0) {\n isOutside = chapters.isOutside()\n\n chapters.destroy()\n chapters = null\n\n if (isOutside) {\n drawer.destroy()\n drawer = null\n }\n }\n\n toolbar.destroy()\n toolbar = null\n\n anchors.destroy()\n anchors = null\n\n this.attr(Outline.DEFAULTS)\n\n return this\n }\n\n onToggle() {\n this.toggle()\n return this\n }\n\n onScrollTop() {\n this.toTop()\n return this\n }\n\n onScrollBottom() {\n this.toBottom()\n return this\n }\n\n onToolbarUpdate({ top, min, max }) {\n const toolbar = this.toolbar\n const current = Math.ceil(top)\n\n if (current <= min) {\n toolbar.hide('up')\n toolbar.show('down')\n } else if (current >= max) {\n toolbar.hide('down')\n toolbar.show('up')\n } else if (current > min && current < max) {\n toolbar.show('up')\n toolbar.show('down')\n }\n\n return this\n }\n\n addListeners() {\n subscribe('toolbar:update', this.onToolbarUpdate, this)\n subscribe('toolbar:action:up', this.onScrollTop, this)\n subscribe('toolbar:action:toggle', this.onToggle, this)\n subscribe('toolbar:action:down', this.onScrollBottom, this)\n return this\n }\n\n removeListeners() {\n unsubscribe('toolbar:update')\n unsubscribe('toolbar:action:up')\n unsubscribe('toolbar:action:toggle')\n unsubscribe('toolbar:action:down')\n return this\n }\n}\n\nOutline.DEFAULTS = {\n articleElement: '#article',\n selector: 'h2,h3,h4,h5,h6',\n title: '目录',\n scrollElement: 'html,body',\n position: 'relative',\n parentElement: '#aside',\n placement: 'rtl',\n showCode: true,\n anchorURL: '',\n stickyHeight: 0,\n homepage: '',\n git: '',\n tags: '',\n issues: '',\n tools: [],\n print: {\n element: '',\n title: ''\n },\n customClass: '',\n afterSticky: null,\n afterToggle: null,\n afterScroll: null,\n chapterTextFilter: null\n}\n\nif (window.jQuery) {\n // 将 Outline 扩展为一个 jquery 插件\n // eslint-disable-next-line no-undef\n jQuery.extend(jQuery.fn, {\n outline: function (options) {\n // eslint-disable-next-line no-undef\n let $article = jQuery(this)\n\n return new Outline(\n // eslint-disable-next-line no-undef\n jQuery.extend({}, options, {\n articleElement: $article\n })\n )\n }\n })\n}\n\nexport default Outline\n","import isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport later from './utils/lang/later'\r\n\r\nconst print = (origins, title) => {\r\n let $origins\r\n let $article\r\n let $title\r\n let $sibling\r\n let tagName\r\n let text = title\r\n\r\n if (isString(origins)) {\r\n $origins =\r\n document.querySelector(origins) || document.getElementById(origins)\r\n } else {\r\n if (isElement(origins)) {\r\n $origins = origins\r\n }\r\n }\r\n\r\n $title = $origins.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n text = $title.innerText\r\n }\r\n\r\n $article = createElement(\r\n 'article',\r\n {\r\n className: 'outline-print'\r\n },\r\n ['']\r\n )\r\n $article.innerHTML = $origins.innerHTML\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-print__title'\r\n },\r\n [text]\r\n )\r\n\r\n $article.insertBefore($title, $article.firstChild)\r\n\r\n document.body.appendChild($article)\r\n\r\n later(() => {\r\n $sibling = $article.previousElementSibling\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-print_sibling')\r\n }\r\n $sibling = $sibling.previousElementSibling\r\n }\r\n\r\n $sibling = $article.nextElementSibling\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-print_sibling')\r\n }\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }, 350)\r\n}\r\n\r\nexport default print\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","offsetTop","el","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","stopPropagation","preventDefault","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","isArray","Array","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","exec","iconName","getSymbol","paint","$body","body","$icons","symbols","add","innerHTML","join","createElement","insertBefore","firstChild","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","className","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","isSVG","pattern","RegExp","test","icon","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","hasClass","allClass","classList","contains","removeClass","remove","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","chapterTextFilter","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","id","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","anchorURL","chapterCode","headingId","href","_updateHeading","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","publish","min","addClass","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","Chapters","$list","$placeholder","$parentElement","active","offsetWidth","$active","scrollTimer","resizeTimer","playing","Observer","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","contents","calculateStickyHeight","byId","chapter","$text","$link","$code","$li","$ul","_paintChapters","positionPlaceholder","sticky","onObserver","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","highlight","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","Math","window","innerHeight","show","FOLDED","HIDDEN","hide","clearTimeout","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","option","ACTIVE","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","guid","uuid","prefix","token","subject","_removeSubscriber","execution","j","_removeSubscriberByToken","Outline","anchors","drawer","toolbar","getElementById","_renderPrint","_renderAnchors","_renderChapters","_renderToolbar","onToolbarUpdate","element","origins","$origins","$article","$sibling","innerText","previousElementSibling","nextElementSibling","print","CHAPTERS_OPTIONS","homepage","git","tags","issues","tools","HOME","GIT","TAGS","ISSUES","MENU","addButton","removeButton","toTop","toBottom","floor","onToggle","onScrollTop","onScrollBottom","ceil","subscribe","unsubscribe","jQuery","extend","outline"],"mappings":"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"} \ No newline at end of file diff --git a/drawer.min.js b/drawer.min.js index 5babb09c..5817b58e 100644 --- a/drawer.min.js +++ b/drawer.min.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Drawer=t()}(this,(function(){"use strict";const e=e=>"string"==typeof e,t=(e,t)=>{const s=Object.prototype.hasOwnProperty;return e&&s.call(e,t)},s=e=>Object.prototype.toString.apply(e),l=e=>"function"==typeof e||"[object Function]"===s(e),i=e=>("[object Object]"===s(e)||"object"==typeof e||l(e))&&null!==e;class r{constructor(e){this.attrs={},e&&this.initialize(e)}initialize(e){return this.attr(e).render().addListeners(),this}attr(s,l){const r=this.attrs;return e(s)?l&&t(r,s)?(r[s]=l,this):r[s]:i(s)?(o=r,n=s,Object.keys(n).forEach((e=>{t(n,e)&&(o[e]=n[e])})),this):0===arguments.length?r:this;var o,n}render(){return this}destroy(){return this.removeListeners(),this}reload(e){return this.destroy().initialize(this.attr(e)),this}addListeners(){return this}removeListeners(){return this}}const o=(e,t=300)=>!!l(e)&&setTimeout((()=>{e()}),t),n=e=>!!(i(e)&&e.nodeName&&e.tagName&&1===e.nodeType),a=(e,t)=>{const s=new RegExp("(\\s|^)"+t+"(\\s|$)");let l,i;return!!n(e)&&(l=e.className,!!l&&(i=e.classList,i?.contains?e.classList.contains(t):!!s.exec(l)))},c=(e,t)=>{let s,l;if(a(e,t))return!1;s=e.classList,s?.add?s.add(t):(l=e.className,l+=l.length>0?" "+t:t,e.className=l)},h=(t,s)=>{let l,i=t.className;if(!i||!a(t,s))return!1;var r;l=t.classList,l?.remove?l.remove(s):(r=i.replace(s,""),i=!!e(r)&&r.replace(/(^\s+)|(\s+$)/g,""),t.className=i)},d=e=>Array.isArray?Array.isArray(e):"[object Array]"===s(e),u=e=>{return!(!i(e)||!(n(e)||(e=>!(!i(e)||"[object NodeList]"!==s(e)))(e)||(t=e,i(t)&&"[object DocumentFragment]"===s(t))||(e=>!(!i(e)||!("[object Text]"===s(e)||e.tagName&&3===e.nodeType)))(e)));var t},m=(s,l,r)=>{const o=document.createDocumentFragment(),n=document.createElement(s),a=t=>u(t)||e(t),c=t=>{let s;if(!a(t))return!1;u(t)?s=t:e(t)&&(s=document.createTextNode(t)),o.appendChild(s)};return i(l)?Object.keys(l).forEach((e=>{t(l,e)&&((e,t,s)=>{let l=e.tagName.toLowerCase();switch(t){case"style":e.style.cssText=s;break;case"value":"input"===l||"textarea"===l?e.value=s:e.setAttribute(t,s);break;case"className":e.className=s;break;default:e.setAttribute(t,s)}})(n,e,l[e])})):d(l)&&l.every((e=>a(e)))&&l.forEach((e=>{c(e)})),d(r)?r.forEach((e=>{c(e)})):c(r),n.appendChild(o),n},p=(e,t="")=>{const s=t.replace(/^>/i,"");return!!(t&&s&&e)&&(e.matches?e.matches(s):!!e.msMatchesSelector&&e.msMatchesSelector(s))},f=e=>e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode,y=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],v=(e,t,s)=>{const l=y.indexOf(t)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(e,t,s){const l=e._listeners;let i=-1;if(l.length<1)return!1;l.forEach(((e,l)=>{const r=e.fn;t===e.type&&(i=l,r===s&&(i=l))})),i>-1&&l.splice(i,1)}(e,t,s),e.removeEventListener(t,s,l)},g=function(t,s,l=!1){const i=e(t)?document.querySelector(t):t,r=i.childNodes,o=((t,s)=>{let l=t._listeners||[];return e(s)&&s&&(l=l.filter((e=>e.type===s))),l})(i,s);o.forEach((e=>{v(i,e.type,e.fn)})),(l||!0===s||1===arguments.length)&&i&&r&&r.forEach((e=>{n(e)&&g(e,s,l)}))},b=(e,t,s)=>{if(!l(s))return g(e,t);v(e,t,s)},$=(e,t,s,l,i,r,o=!1)=>{const n=y.indexOf(s)>-1,a=function(n){const c=function(e){const t=e.target;return(s=t)&&3===s.nodeType?s.parentNode:s;var s}(n),h=((e,t,s,l)=>{const i=s||document;if(!e)return null;do{if(null!=t&&(t.startsWith(">")?e.parentNode===i&&p(e,t):p(e,t))||l&&e===i)return e;if(e===i)break}while(e=f(e))})(c,t,e);let d=r||e;n.delegateTarget=h,!0===r&&(d=i),h&&(!0===o&&b(e,s,a),l.call(d,n,i))};e._listeners||(e._listeners=[]),e._listeners.push({el:e,selector:t,type:s,fn:a,data:i,context:r,capture:n}),l._delegateListener=a,e.addEventListener(s,a,n)},w=['','','','','','','','',''],_=(t,s="icon")=>e(t)?((e,t="icon")=>{const s=/id="(.*?)"/,l=/^(\w+)-/;return w.find((i=>{const r=s.exec(i)[1];return l.exec(r)[1]===t&&r===("icon"===t?`${t}-${e}`:`${t}-icon-${e}`)}))})(t,s):[...w],z=(t="")=>{const s=document.body;let l=document.querySelector("#outline-icons"),i=[];(t=>{if(!t)return!1;d(t)&&t.length>0?t.forEach((t=>{-1===w.indexOf(t)&&e(t)&&w.push(t)})):e(t)&&w.push(t)})(t),i=_(),l?l.innerHTML=i.join(""):(l=document.createElement("div"),l.innerHTML=``,s.insertBefore(l.firstChild,s.firstChild))},x=t=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return e(t)&&s.test(t)},L=(t,s={})=>((t,s={})=>{const l=s.size||0,i=s.color||"",r=s.iconSet||"",o=d(l)?l[0]:l,n=d(l)?l[1]:l,a=l?`width:${o}px;height:${n}px;`:"",c=i?a+`color:${i}`:a,h=document.createElement("i");let u,m="",p="";return e(t)?(x(t)?p=t:(m=r&&"icon"!==r?`xlink:href="#${r}-icon-${t}"`:`xlink:href="#icon-${t}"`,p=``),h.className="outline-icon",h.innerHTML=p,x(t)&&(u=h.querySelector("svg"),u.setAttribute("aria-hidden","true"),u.setAttribute("xmlns","http://www.w3.org/2000/svg"),u.setAttribute("class","outline-icon__svg"),u.setAttribute("width","200"),u.setAttribute("height","200"),u.style=c),h):null})(t,s);let M=2e3;const N=e=>{var t,s;return e?M=e:M+=1,t="--outline-zIndex",s=`${M}`,document.documentElement.style.setProperty(t,s),M};class T extends r{constructor(e){super(),this.attrs=T.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,e&&this.initialize(e)}initialize(e){let t;return this.attr(e),this.title=this.attr("title"),t=this.attr("created"),l(t)&&t.call(this),this.render().addListeners(),this}setTitle(e){return this.attr("title",e),this.title=e,this.$title.innerHTML=e,this}isClosed(){return this.closed}render(){const e=this.attr("mounted"),t=this.attr("size"),s=this.attr("placement"),i=this.attr("hasClose"),r=this.attr("hasOverlay"),o=this.attr("hasOffset"),n=this.attr("hasPadding"),a=this.attr("autoHeight"),h=this.attr("customClass");let d,u,p,f,y,v,g,b;return z(),this.zIndex=N(),f=m("h2",{className:"outline-drawer__title"},[this.title]),this.$title=f,i&&(y=m("div",{className:"outline-drawer__close"},[L("close",{size:20})]),this.$close=y),p=m("header",{className:"outline-drawer__header"},[f,y]),this.$header=p,v=m("div",{className:"outline-drawer__main"},[""]),this.$main=v,n||c(v,"outline-drawer_full"),g=m("footer",{className:"outline-drawer__footer"},[""]),this.$footer=g,u=m("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${t} outline-drawer_closed`},[p,v,g]),this.$modal=u,o&&c(u,"outline-drawer_offset"),a&&c(u,"outline-drawer_auto"),h&&c(u,h),r&&(b=m("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=b),d=m("div",{className:"outline-drawer"},[u,b]),this.$el=d,document.body.appendChild(d),l(e)&&e.call(this),this}open(){const e=this.attr("afterOpened"),t=this.$modal;return c(this.$el,"outline-drawer_opened"),h(t,"outline-drawer_closed"),c(t,"outline-drawer_opened"),o((()=>{this.closed=!1,l(e)&&e.call(this)})),this}close(){const e=this.attr("afterClosed"),t=this.$modal;return h(t,"outline-drawer_opened"),c(t,"outline-drawer_closed"),o((()=>{h(this.$el,"outline-drawer_opened"),this.closed=!0,l(e)&&e.call(this)})),this}toggle(){const e=this.attr("afterToggle"),t=this.isClosed();return t?this.open():this.close(),l(e)&&o((()=>{e.call(this,t)})),this}destroy(){const e=this.attr("afterDestroy"),t=this.attr("beforeDestroy");let s=this.zIndex;return l(t)&&t.call(this),this.removeListeners(),this.attrs=T.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,N(s),this.zIndex=0,l(e)&&e.call(this),this}addListeners(){const e=this.attr("hasClose"),t=this.attr("hasOverlay"),s=this.$el;return e&&$(s,".outline-drawer__close","click",this.onClose,this,!0),t&&$(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const e=this.attr("hasClose"),t=this.attr("hasOverlay"),s=this.$el;return e||t?(b(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}return T.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null},T})); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Drawer=t()}(this,(function(){"use strict";const e=e=>"string"==typeof e,t=(e,t)=>{const s=Object.prototype.hasOwnProperty;return e&&s.call(e,t)},s=e=>Object.prototype.toString.apply(e),l=e=>"function"==typeof e||"[object Function]"===s(e),i=e=>("[object Object]"===s(e)||"object"==typeof e||l(e))&&null!==e;class r{constructor(e){this.attrs={},e&&this.initialize(e)}initialize(e){return this.attr(e).render().addListeners(),this}attr(s,l){const r=this.attrs;return e(s)?l&&t(r,s)?(r[s]=l,this):r[s]:i(s)?(o=r,n=s,Object.keys(n).forEach((e=>{t(n,e)&&(o[e]=n[e])})),this):0===arguments.length?r:this;var o,n}render(){return this}destroy(){return this.removeListeners(),this}reload(e){return this.destroy().initialize(this.attr(e)),this}addListeners(){return this}removeListeners(){return this}}const o=(e,t=300)=>!!l(e)&&setTimeout((()=>{e()}),t),n=e=>!!(i(e)&&e.nodeName&&e.tagName&&1===e.nodeType),a=(e,t)=>{const s=new RegExp("(\\s|^)"+t+"(\\s|$)");let l,i;return!!n(e)&&(l=e.className,!!l&&(i=e.classList,i?.contains?e.classList.contains(t):!!s.exec(l)))},c=(e,t)=>{let s,l;if(a(e,t))return!1;s=e.classList,s?.add?s.add(t):(l=e.className,l+=l.length>0?" "+t:t,e.className=l)},h=(t,s)=>{let l,i=t.className;if(!i||!a(t,s))return!1;var r;l=t.classList,l?.remove?l.remove(s):(r=i.replace(s,""),i=!!e(r)&&r.replace(/(^\s+)|(\s+$)/g,""),t.className=i)},d=e=>Array.isArray?Array.isArray(e):"[object Array]"===s(e),u=e=>{return!(!i(e)||!(n(e)||(e=>!(!i(e)||"[object NodeList]"!==s(e)))(e)||(t=e,i(t)&&"[object DocumentFragment]"===s(t))||(e=>!(!i(e)||!("[object Text]"===s(e)||e.tagName&&3===e.nodeType)))(e)));var t},m=(s,l,r)=>{const o=document.createDocumentFragment(),n=document.createElement(s),a=t=>u(t)||e(t),c=t=>{let s;if(!a(t))return!1;u(t)?s=t:e(t)&&(s=document.createTextNode(t)),o.appendChild(s)};return i(l)?Object.keys(l).forEach((e=>{t(l,e)&&((e,t,s)=>{let l=e.tagName.toLowerCase();switch(t){case"style":e.style.cssText=s;break;case"value":"input"===l||"textarea"===l?e.value=s:e.setAttribute(t,s);break;case"className":e.className=s;break;default:e.setAttribute(t,s)}})(n,e,l[e])})):d(l)&&l.every((e=>a(e)))&&l.forEach((e=>{c(e)})),d(r)?r.forEach((e=>{c(e)})):c(r),n.appendChild(o),n},p=(e,t="")=>{const s=t.replace(/^>/i,"");return!!(t&&s&&e)&&(e.matches?e.matches(s):!!e.msMatchesSelector&&e.msMatchesSelector(s))},f=e=>e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode,y=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],v=(e,t,s)=>{const l=y.indexOf(t)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(e,t,s){const l=e._listeners;let i=-1;if(l.length<1)return!1;l.forEach(((e,l)=>{const r=e.fn;t===e.type&&(i=l,r===s&&(i=l))})),i>-1&&l.splice(i,1)}(e,t,s),e.removeEventListener(t,s,l)},g=function(t,s,l=!1){const i=e(t)?document.querySelector(t):t,r=i.childNodes,o=((t,s)=>{let l=t._listeners||[];return e(s)&&s&&(l=l.filter((e=>e.type===s))),l})(i,s);o.forEach((e=>{v(i,e.type,e.fn)})),(l||!0===s||1===arguments.length)&&i&&r&&r.forEach((e=>{n(e)&&g(e,s,l)}))},b=(e,t,s)=>{if(!l(s))return g(e,t);v(e,t,s)},$=(e,t,s,l,i,r,o=!1)=>{const n=y.indexOf(s)>-1,a=function(n){const c=function(e){const t=e.target;return(s=t)&&3===s.nodeType?s.parentNode:s;var s}(n),h=((e,t,s,l)=>{const i=s||document;if(!e)return null;do{if(null!=t&&(t.startsWith(">")?e.parentNode===i&&p(e,t):p(e,t))||l&&e===i)return e;if(e===i)break}while(e=f(e))})(c,t,e);let d=r||e;n.delegateTarget=h,!0===r&&(d=i),h&&(!0===o&&b(e,s,a),l.call(d,n,i))};e._listeners||(e._listeners=[]),e._listeners.push({el:e,selector:t,type:s,fn:a,data:i,context:r,capture:n}),l._delegateListener=a,e.addEventListener(s,a,n)},w=['','','','','','','','',''],_=(t,s="icon")=>e(t)?((e,t="icon")=>{const s=/id="(.*?)"/,l=/^(\w+)-/;return w.find((i=>{const r=s.exec(i)[1];return l.exec(r)[1]===t&&r===("icon"===t?`${t}-${e}`:`${t}-icon-${e}`)}))})(t,s):[...w],z=(t="")=>{const s=document.body;let l=document.querySelector("#outline-icons"),i=[];(t=>{if(!t)return!1;d(t)&&t.length>0?t.forEach((t=>{-1===w.indexOf(t)&&e(t)&&w.push(t)})):e(t)&&w.push(t)})(t),i=_(),l?l.innerHTML=i.join(""):(l=document.createElement("div"),l.innerHTML=``,s.insertBefore(l.firstChild,s.firstChild))},x=t=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return e(t)&&s.test(t)},L=(t,s={})=>((t,s={})=>{const l=s.size||0,i=s.color||"",r=s.iconSet||"",o=d(l)?l[0]:l,n=d(l)?l[1]:l,a=l?`width:${o}px;height:${n}px;`:"",c=i?a+`color:${i}`:a,h=document.createElement("i");let u,m="",p="";return e(t)?(x(t)?p=t:(m=r&&"icon"!==r?`xlink:href="#${r}-icon-${t}"`:`xlink:href="#icon-${t}"`,p=``),h.className="outline-icon",h.innerHTML=p,x(t)&&(u=h.querySelector("svg"),u.setAttribute("aria-hidden","true"),u.setAttribute("xmlns","http://www.w3.org/2000/svg"),u.setAttribute("class","outline-icon__svg"),u.setAttribute("width","200"),u.setAttribute("height","200"),u.style.cssText=c),h):null})(t,s);let M=2e3;const N=e=>{var t,s;return e?M=e:M+=1,t="--outline-zIndex",s=`${M}`,document.documentElement.style.setProperty(t,s),M};class T extends r{constructor(e){super(),this.attrs=T.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,e&&this.initialize(e)}initialize(e){let t;return this.attr(e),this.title=this.attr("title"),t=this.attr("created"),l(t)&&t.call(this),this.render().addListeners(),this}setTitle(e){return this.attr("title",e),this.title=e,this.$title.innerHTML=e,this}isClosed(){return this.closed}render(){const e=this.attr("mounted"),t=this.attr("size"),s=this.attr("placement"),i=this.attr("hasClose"),r=this.attr("hasOverlay"),o=this.attr("hasOffset"),n=this.attr("hasPadding"),a=this.attr("autoHeight"),h=this.attr("customClass");let d,u,p,f,y,v,g,b;return z(),this.zIndex=N(),f=m("h2",{className:"outline-drawer__title"},[this.title]),this.$title=f,i&&(y=m("div",{className:"outline-drawer__close"},[L("close",{size:20})]),this.$close=y),p=m("header",{className:"outline-drawer__header"},[f,y]),this.$header=p,v=m("div",{className:"outline-drawer__main"},[""]),this.$main=v,n||c(v,"outline-drawer_full"),g=m("footer",{className:"outline-drawer__footer"},[""]),this.$footer=g,u=m("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${t} outline-drawer_closed`},[p,v,g]),this.$modal=u,o&&c(u,"outline-drawer_offset"),a&&c(u,"outline-drawer_auto"),h&&c(u,h),r&&(b=m("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=b),d=m("div",{className:"outline-drawer"},[u,b]),this.$el=d,document.body.appendChild(d),l(e)&&e.call(this),this}open(){const e=this.attr("afterOpened"),t=this.$modal;return c(this.$el,"outline-drawer_opened"),h(t,"outline-drawer_closed"),c(t,"outline-drawer_opened"),o((()=>{this.closed=!1,l(e)&&e.call(this)})),this}close(){const e=this.attr("afterClosed"),t=this.$modal;return h(t,"outline-drawer_opened"),c(t,"outline-drawer_closed"),o((()=>{h(this.$el,"outline-drawer_opened"),this.closed=!0,l(e)&&e.call(this)})),this}toggle(){const e=this.attr("afterToggle"),t=this.isClosed();return t?this.open():this.close(),l(e)&&o((()=>{e.call(this,t)})),this}destroy(){const e=this.attr("afterDestroy"),t=this.attr("beforeDestroy");let s=this.zIndex;return l(t)&&t.call(this),this.removeListeners(),this.attrs=T.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,N(s),this.zIndex=0,l(e)&&e.call(this),this}addListeners(){const e=this.attr("hasClose"),t=this.attr("hasOverlay"),s=this.$el;return e&&$(s,".outline-drawer__close","click",this.onClose,this,!0),t&&$(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const e=this.attr("hasClose"),t=this.attr("hasOverlay"),s=this.$el;return e||t?(b(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}return T.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null},T})); //# sourceMappingURL=drawer.min.js.map diff --git a/drawer.min.js.map b/drawer.min.js.map index b0be34b8..0fa543cb 100644 --- a/drawer.min.js.map +++ b/drawer.min.js.map @@ -1 +1 @@ -{"version":3,"file":"drawer.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/lang/later.js","src/utils/types/isElement.js","src/utils/dom/hasClass.js","src/utils/dom/addClass.js","src/utils/dom/removeClass.js","src/utils/lang/trim.js","src/utils/types/isArray.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/createElement.js","src/utils/dom/setAttribute.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/icons/symbols.js","src/utils/icons/defaults.js","src/utils/icons/getSymbols.js","src/utils/icons/getSymbol.js","src/utils/icons/paint.js","src/utils/icons/add.js","src/utils/types/isSVG.js","src/utils/icons/icon.js","src/utils/icons/createElement.js","src/zIndex.js","src/utils/dom/setProperty.js","src/drawer.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from '../types/isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg =\n `` +\n `` +\n ``\n }\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n if (isSVG(name)) {\n $svg = $icon.querySelector('svg')\n $svg.setAttribute('aria-hidden', 'true')\n $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n $svg.setAttribute('class', 'outline-icon__svg')\n $svg.setAttribute('width', '200')\n $svg.setAttribute('height', '200')\n $svg.style = cssRules\n }\n\n return $icon\n}\n\nexport default createElement\n","import setProperty from './utils/dom/setProperty'\n\nlet index = 2000\n\nconst zIndex = (idx) => {\n if (idx) {\n index = idx\n } else {\n index += 1\n }\n\n setProperty('--outline-zIndex', `${index}`)\n\n return index\n}\n\nexport default zIndex\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import Base from './base'\n\nimport later from './utils/lang/later'\nimport isFunction from './utils/types/isFunction'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport paint from './utils/icons/paint'\nimport icon from './utils/icons/icon'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = true\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n\n this.title = this.attr('title')\n created = this.attr('created')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n return this\n }\n\n setTitle(title) {\n this.attr('title', title)\n this.title = title\n this.$title.innerHTML = title\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n render() {\n const mounted = this.attr('mounted')\n const size = this.attr('size')\n const placement = this.attr('placement')\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const hasOffset = this.attr('hasOffset')\n const hasPadding = this.attr('hasPadding')\n const autoHeight = this.attr('autoHeight')\n const customClass = this.attr('customClass')\n let $el\n let $modal\n let $header\n let $title\n let $close\n let $main\n let $footer\n let $overlay\n\n paint()\n this.zIndex = zIndex()\n\n $title = createElement(\n 'h2',\n {\n className: 'outline-drawer__title'\n },\n [this.title]\n )\n this.$title = $title\n\n if (hasClose) {\n $close = createElement(\n 'div',\n {\n className: 'outline-drawer__close'\n },\n [icon('close', { size: 20 })]\n )\n this.$close = $close\n }\n\n $header = createElement(\n 'header',\n {\n className: 'outline-drawer__header'\n },\n [$title, $close]\n )\n this.$header = $header\n\n $main = createElement(\n 'div',\n {\n className: 'outline-drawer__main'\n },\n ['']\n )\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement(\n 'footer',\n {\n className: 'outline-drawer__footer'\n },\n ['']\n )\n this.$footer = $footer\n\n $modal = createElement(\n 'div',\n {\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\n },\n [$header, $main, $footer]\n )\n this.$modal = $modal\n\n if (hasOffset) {\n addClass($modal, 'outline-drawer_offset')\n }\n\n if (autoHeight) {\n addClass($modal, 'outline-drawer_auto')\n }\n\n if (customClass) {\n addClass($modal, customClass)\n }\n\n if (hasOverlay) {\n $overlay = createElement(\n 'div',\n {\n className: 'outline-drawer__overlay'\n },\n ['']\n )\n this.$overlay = $overlay\n }\n\n $el = createElement(\n 'div',\n {\n className: `outline-drawer`\n },\n [$modal, $overlay]\n )\n this.$el = $el\n document.body.appendChild($el)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n open() {\n const opened = this.attr('afterOpened')\n const $modal = this.$modal\n\n addClass(this.$el, 'outline-drawer_opened')\n removeClass($modal, 'outline-drawer_closed')\n addClass($modal, 'outline-drawer_opened')\n\n later(() => {\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n })\n\n return this\n }\n\n close() {\n const closed = this.attr('afterClosed')\n const $modal = this.$modal\n\n removeClass($modal, 'outline-drawer_opened')\n addClass($modal, 'outline-drawer_closed')\n\n later(() => {\n removeClass(this.$el, 'outline-drawer_opened')\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n })\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const closed = this.isClosed()\n\n if (closed) {\n this.open()\n } else {\n this.close()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n afterToggle.call(this, closed)\n })\n }\n\n return this\n }\n\n destroy() {\n const afterDestroy = this.attr('afterDestroy')\n const beforeDestroy = this.attr('beforeDestroy')\n let index = this.zIndex\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = false\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n\n index -= 1\n zIndex(index)\n this.zIndex = 0\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n addListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay) {\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (!hasClose && !hasOverlay) {\n return this\n }\n\n off($el, 'click', this.onClose)\n\n return this\n }\n\n onClose() {\n this.close()\n return this\n }\n}\n\nDrawer.DEFAULTS = {\n placement: 'rtl',\n title: '标题',\n size: 'regular',\n hasClose: true,\n hasOverlay: true,\n hasOffset: false,\n hasPadding: true,\n autoHeight: true,\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterToggle: null\n}\n\nexport default Drawer\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","later","fn","delay","setTimeout","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","add","removeClass","remove","replace","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","toLowerCase","style","cssText","setAttribute","every","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","filter","getListeners","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","iconName","getSymbol","paint","$body","body","$icons","symbols","innerHTML","join","insertBefore","firstChild","isSVG","test","icon","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","zIndex","idx","documentElement","setProperty","Drawer","super","DEFAULTS","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","created","setTitle","isClosed","mounted","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","afterDestroy","beforeDestroy","onClose","afterClosed","afterOpened","afterScroll"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"drawer.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/lang/later.js","src/utils/types/isElement.js","src/utils/dom/hasClass.js","src/utils/dom/addClass.js","src/utils/dom/removeClass.js","src/utils/lang/trim.js","src/utils/types/isArray.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/createElement.js","src/utils/dom/setAttribute.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/icons/symbols.js","src/utils/icons/defaults.js","src/utils/icons/getSymbols.js","src/utils/icons/getSymbol.js","src/utils/icons/paint.js","src/utils/icons/add.js","src/utils/types/isSVG.js","src/utils/icons/icon.js","src/utils/icons/createElement.js","src/zIndex.js","src/utils/dom/setProperty.js","src/drawer.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from '../types/isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg =\n `` +\n `` +\n ``\n }\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n if (isSVG(name)) {\n $svg = $icon.querySelector('svg')\n $svg.setAttribute('aria-hidden', 'true')\n $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n $svg.setAttribute('class', 'outline-icon__svg')\n $svg.setAttribute('width', '200')\n $svg.setAttribute('height', '200')\n $svg.style.cssText = cssRules\n }\n\n return $icon\n}\n\nexport default createElement\n","import setProperty from './utils/dom/setProperty'\n\nlet index = 2000\n\nconst zIndex = (idx) => {\n if (idx) {\n index = idx\n } else {\n index += 1\n }\n\n setProperty('--outline-zIndex', `${index}`)\n\n return index\n}\n\nexport default zIndex\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import Base from './base'\n\nimport later from './utils/lang/later'\nimport isFunction from './utils/types/isFunction'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport paint from './utils/icons/paint'\nimport icon from './utils/icons/icon'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = true\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n\n this.title = this.attr('title')\n created = this.attr('created')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n return this\n }\n\n setTitle(title) {\n this.attr('title', title)\n this.title = title\n this.$title.innerHTML = title\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n render() {\n const mounted = this.attr('mounted')\n const size = this.attr('size')\n const placement = this.attr('placement')\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const hasOffset = this.attr('hasOffset')\n const hasPadding = this.attr('hasPadding')\n const autoHeight = this.attr('autoHeight')\n const customClass = this.attr('customClass')\n let $el\n let $modal\n let $header\n let $title\n let $close\n let $main\n let $footer\n let $overlay\n\n paint()\n this.zIndex = zIndex()\n\n $title = createElement(\n 'h2',\n {\n className: 'outline-drawer__title'\n },\n [this.title]\n )\n this.$title = $title\n\n if (hasClose) {\n $close = createElement(\n 'div',\n {\n className: 'outline-drawer__close'\n },\n [icon('close', { size: 20 })]\n )\n this.$close = $close\n }\n\n $header = createElement(\n 'header',\n {\n className: 'outline-drawer__header'\n },\n [$title, $close]\n )\n this.$header = $header\n\n $main = createElement(\n 'div',\n {\n className: 'outline-drawer__main'\n },\n ['']\n )\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement(\n 'footer',\n {\n className: 'outline-drawer__footer'\n },\n ['']\n )\n this.$footer = $footer\n\n $modal = createElement(\n 'div',\n {\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\n },\n [$header, $main, $footer]\n )\n this.$modal = $modal\n\n if (hasOffset) {\n addClass($modal, 'outline-drawer_offset')\n }\n\n if (autoHeight) {\n addClass($modal, 'outline-drawer_auto')\n }\n\n if (customClass) {\n addClass($modal, customClass)\n }\n\n if (hasOverlay) {\n $overlay = createElement(\n 'div',\n {\n className: 'outline-drawer__overlay'\n },\n ['']\n )\n this.$overlay = $overlay\n }\n\n $el = createElement(\n 'div',\n {\n className: `outline-drawer`\n },\n [$modal, $overlay]\n )\n this.$el = $el\n document.body.appendChild($el)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n open() {\n const opened = this.attr('afterOpened')\n const $modal = this.$modal\n\n addClass(this.$el, 'outline-drawer_opened')\n removeClass($modal, 'outline-drawer_closed')\n addClass($modal, 'outline-drawer_opened')\n\n later(() => {\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n })\n\n return this\n }\n\n close() {\n const closed = this.attr('afterClosed')\n const $modal = this.$modal\n\n removeClass($modal, 'outline-drawer_opened')\n addClass($modal, 'outline-drawer_closed')\n\n later(() => {\n removeClass(this.$el, 'outline-drawer_opened')\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n })\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const closed = this.isClosed()\n\n if (closed) {\n this.open()\n } else {\n this.close()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n afterToggle.call(this, closed)\n })\n }\n\n return this\n }\n\n destroy() {\n const afterDestroy = this.attr('afterDestroy')\n const beforeDestroy = this.attr('beforeDestroy')\n let index = this.zIndex\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = false\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n\n index -= 1\n zIndex(index)\n this.zIndex = 0\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n addListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay) {\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (!hasClose && !hasOverlay) {\n return this\n }\n\n off($el, 'click', this.onClose)\n\n return this\n }\n\n onClose() {\n this.close()\n return this\n }\n}\n\nDrawer.DEFAULTS = {\n placement: 'rtl',\n title: '标题',\n size: 'regular',\n hasClose: true,\n hasOverlay: true,\n hasOffset: false,\n hasPadding: true,\n autoHeight: true,\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterToggle: null\n}\n\nexport default Drawer\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","later","fn","delay","setTimeout","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","add","removeClass","remove","replace","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","toLowerCase","style","cssText","setAttribute","every","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","filter","getListeners","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","iconName","getSymbol","paint","$body","body","$icons","symbols","innerHTML","join","insertBefore","firstChild","isSVG","test","icon","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","zIndex","idx","documentElement","setProperty","Drawer","super","DEFAULTS","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","created","setTitle","isClosed","mounted","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","afterDestroy","beforeDestroy","onClose","afterClosed","afterOpened","afterScroll"],"mappings":"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"} \ No newline at end of file diff --git a/outline.min.js b/outline.min.js index 3c20169a..33b1965a 100644 --- a/outline.min.js +++ b/outline.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Outline=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),r=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class l{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const l=this.attrs;return t(s)?i&&e(l,s)?(l[s]=i,this):l[s]:r(s)?(n=l,o=s,Object.keys(o).forEach((t=>{e(o,t)&&(n[t]=o[t])})),this):0===arguments.length?l:this;var n,o}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const n=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),o=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),h=t=>t*t,a=(e=null)=>{let s,i;return e?t(e)?i=document.querySelector(e):n(e)&&(i=e):(s=document.querySelectorAll("html,body"),i=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),i},c=(t,e,s)=>{const r=a(t);let l=r.scrollTop,n=0;const o=e-l,c=r.scrollHeight,d=e-c<=0?e:c,u=t=>(i(s)&&s(t),!1),p=()=>{if(n+=1,o<0){if(l-=h(n),r.scrollTop=l,l<=e)return r.scrollTop=e,u(e)}else if(l+=h(n),r.scrollTop=l,l>=d)return r.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)},d=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=d(t.offsetParent)),e},u=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},p=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,m=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],f=(t,e,s)=>{const i=m.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},g=function(e,s,i=!1){const r=t(e)?document.querySelector(e):e,l=r.childNodes,o=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(r,s);o.forEach((t=>{f(r,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&r&&l&&l.forEach((t=>{n(t)&&g(t,s,i)}))},b=(t,e,s)=>{if(!i(s))return g(t,e);f(t,e,s)},y=(t,e,s,i,r,l,n=!1)=>{const o=m.indexOf(s)>-1,h=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||i&&t===r)return t;if(t===r)break}while(t=p(t))})(a,e,t);let d=l||t;o.delegateTarget=c,!0===l&&(d=r),c&&(!0===n&&b(t,s,h),i.call(d,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},$=function(t){t.stopPropagation(),t.preventDefault()},v={},E=t=>e(v,t)&&v[t].length>0,_=(t,e=!0)=>e?E(t):(t=>{let e=E(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=E(t);return e})(t),T=(t,e,i=!0)=>{const r=t=>{if(!E(t))return!1;v[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},l=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),r(e);r(t),r("*")};if(!_(t))return!1;i?setTimeout(l,10):l()},w=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),S=['','','','','','','','',''],x=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return S.find((r=>{const l=s.exec(r)[1];return i.exec(l)[1]===e&&l===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):[...S],L=(e="")=>{const s=document.body;let i=document.querySelector("#outline-icons"),r=[];(e=>{if(!e)return!1;w(e)&&e.length>0?e.forEach((e=>{-1===S.indexOf(e)&&t(e)&&S.push(e)})):t(e)&&S.push(e)})(e),r=x(),i?i.innerHTML=r.join(""):(i=document.createElement("div"),i.innerHTML=``,s.insertBefore(i.firstChild,s.firstChild))},C=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),z=t=>{return!(!r(t)||!(n(t)||(t=>!(!r(t)||"[object NodeList]"!==s(t)))(t)||(e=t,r(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!r(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},k=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}},A=(s,i,l)=>{const n=document.createDocumentFragment(),o=document.createElement(s),h=e=>z(e)||t(e),a=e=>{let s;if(!h(e))return!1;z(e)?s=e:t(e)&&(s=document.createTextNode(e)),n.appendChild(s)};return r(i)?Object.keys(i).forEach((t=>{e(i,t)&&k(o,t,i[t])})):w(i)&&i.every((t=>h(t)))&&i.forEach((t=>{a(t)})),w(l)?l.forEach((t=>{a(t)})):a(l),o.appendChild(n),o},N=e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)},M=(e,s={})=>((e,s={})=>{const i=s.size||0,r=s.color||"",l=s.iconSet||"",n=w(i)?i[0]:i,o=w(i)?i[1]:i,h=i?`width:${n}px;height:${o}px;`:"",a=r?h+`color:${r}`:h,c=document.createElement("i");let d,u="",p="";return t(e)?(N(e)?p=e:(u=l&&"icon"!==l?`xlink:href="#${l}-icon-${e}"`:`xlink:href="#icon-${e}"`,p=``),c.className="outline-icon",c.innerHTML=p,N(e)&&(d=c.querySelector("svg"),d.setAttribute("aria-hidden","true"),d.setAttribute("xmlns","http://www.w3.org/2000/svg"),d.setAttribute("class","outline-icon__svg"),d.setAttribute("width","200"),d.setAttribute("height","200"),d.style=a),c):null})(e,s),H=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!n(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},O=(t,e)=>{let s,i=t.className;if(!i||!H(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=C(i.replace(e,"")),t.className=i)},D=(e,s=!0,i=!0)=>{const r="outline-heading",l=e.innerHTML;let n;if(e.innerHTML=l.replace(/^\d+(\.?\d+)*\s?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),O(e,r),!s)return!1;var o;n=e.querySelector(`.${r}__anchor`),i&&O(e,`${r}_start`),o=C(e.className),t(o)&&""===o&&e.removeAttribute("class"),e.removeChild(n)},F=(e,s=!0,r=null)=>{let l=1,n=0,o="";const h=[];return e.forEach(((e,s)=>{const a=e.tagName,c=a.replace(/h/i,"");let d=parseInt(c,10),u=-1;var p;d>l?(n+=1,u=1===n?-1:s-1):d===l||dn?1===d?(n=1,u=-1):u=h[s-1].pid:d<=n&&(1===d?n=1:(n-=l-d,n<=1&&(n=1)),u=1===n?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"",i(r)&&(o=r(o)),h.push({id:s,pid:u,level:n,rel:`heading-${s}`,text:o,tagName:a})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const s=e[`[${t.id}]`];if(!s||!w(s))return!1;s.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(h):h};class j extends l{constructor(t){super(),this.attrs=j.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){const s=this.attr("showCode")||!0;let r,l,o,h,c;return this.attr(e),c=this.attr("articleElement"),l=this.attr("scrollElement"),o=this.attr("selector"),r=this.attr("created"),t(c)?h=document.querySelector(c):n(c)&&(h=c),h?(this.$articleElement=h,this.$scrollElement=a(l),this.$headings=[...h.querySelectorAll(o)],this.$headings.length<1||(this.chapters=F(this.$headings,s,this.attr("chapterTextFilter")),i(r)&&r.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),s=this.attr("isAtStart"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.$headings,o=this.getChapters();return L(),n.forEach(((t,i)=>{const n=o[i].code;((t,e,s)=>{const i=document.createDocumentFragment(),r="outline-heading",l=s.hasAnchor||!0,n=s.isAtStart||!0,o=s.showCode||!1,h=s.chapterCode||"",a=s.anchorURL||"",c=`heading-${e}`,d={id:c,className:n?`${r} ${r}_start`:r,"data-id":e},u=Object.keys(d),p=C(t.innerHTML);let m,f;if(u.forEach((e=>{k(t,e,d[e])})),o&&(t.innerHTML=h+" "+p),!l)return!1;f=M("hash",{iconSet:"outline"}),m=A("a",{id:`anchor-${e}`,className:`${r}__anchor anchor-${e}`,href:a||`#${c}`,target:a?"_blank":"self","data-id":e},[f]),i.appendChild(m),t.appendChild(i)})(t,i,{hasAnchor:e,isAtStart:s,showCode:r,chapterCode:n,anchorURL:l})})),i(t)&&t.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),s=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return i(s)&&s.call(this),this.removeListeners(),l.forEach((s=>{D(s,t,e)})),this.attr(j.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],i(r)&&r.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),s=this.attr("afterScroll"),r=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,n=d(l)-(r+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(n,(()=>{i(s)&&s.call(this,"anchor"),o((()=>{T("toolbar:update",{top:n,min:0,max:a})}))})),e||$(t),this}addListeners(){const t=this.$articleElement;return y(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return b(t,"click",this.onAnchorTrigger),this}}j.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null};const U=(t,e)=>{let s,i;if(H(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},I=(t,e)=>{document.documentElement.style.setProperty(t,e)};let q=2e3;const B=t=>(t?q=t:q+=1,I("--outline-zIndex",`${q}`),q);class R extends l{constructor(t){super(),this.attrs=R.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),i(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),s=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),h=this.attr("autoHeight"),a=this.attr("customClass");let c,d,u,p,m,f,g,b;return L(),this.zIndex=B(),p=A("h2",{className:"outline-drawer__title"},[this.title]),this.$title=p,r&&(m=A("div",{className:"outline-drawer__close"},[M("close",{size:20})]),this.$close=m),u=A("header",{className:"outline-drawer__header"},[p,m]),this.$header=u,f=A("div",{className:"outline-drawer__main"},[""]),this.$main=f,o||U(f,"outline-drawer_full"),g=A("footer",{className:"outline-drawer__footer"},[""]),this.$footer=g,d=A("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${e} outline-drawer_closed`},[u,f,g]),this.$modal=d,n&&U(d,"outline-drawer_offset"),h&&U(d,"outline-drawer_auto"),a&&U(d,a),l&&(b=A("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=b),c=A("div",{className:"outline-drawer"},[d,b]),this.$el=c,document.body.appendChild(c),i(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return U(this.$el,"outline-drawer_opened"),O(e,"outline-drawer_closed"),U(e,"outline-drawer_opened"),o((()=>{this.closed=!1,i(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return O(e,"outline-drawer_opened"),U(e,"outline-drawer_closed"),o((()=>{O(this.$el,"outline-drawer_opened"),this.closed=!0,i(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),i(t)&&o((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let s=this.zIndex;return i(e)&&e.call(this),this.removeListeners(),this.attrs=R.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,B(s),this.zIndex=0,i(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&y(s,".outline-drawer__close","click",this.onClose,this,!0),e&&y(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(b(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}R.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const P=(t,e,s,r,l,n=!1)=>{const o=m.indexOf(e)>-1,h=function(i){let o=l||t;!0===l&&(o=r),!0===n&&b(t,e,h),s.call(o,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:h,data:r,context:l,capture:o}),s._delegateListener=h,t.addEventListener(e,h,o)},Q=(t,e)=>getComputedStyle(t)[e];class W extends l{constructor(t){super(),this.attrs=W.DEFAULTS,this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.closed=!1,this.active=0,this.offsetTop=0,this.offsetWidth=0,this.$active=null,this.scrollTimer=null,this.resizeTimer=null,this.playing=!1,this.Observer=null,t&&this.initialize(t)}initialize(e){let s,r,l,o;return this.attr(e),s=this.attr("created"),r=this.attr("parentElement"),l=this.attr("scrollElement"),t(r)?o=document.querySelector(r):n(r)&&(o=r),this.$parentElement=o,this.$scrollElement=a(l),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),s=this.attr("customClass"),i=this.$parentElement,r=[];let l,n,o,h,a=null;return i?(this.isInside()&&e&&(a=A("h2",{className:"outline-chapters__title"},[e]),this.$title=a,r.push(a)),o=A("ul",{className:"outline-chapters__list"},[""]),this.$list=o,h=A("div",{className:"outline-chapters__placeholder"},[""]),this.$placeholder=h,n=A("div",{className:"outline-chapters__main"},[o,h]),this.$main=n,r.push(n),l=A("nav",{id:"outline-chapters",className:"outline-chapters outline-chapters_hidden"},r),this.$el=l,this.isSticky()&&(this.calculateStickyHeight(),U(l,"outline-chapters_sticky")),s&&U(l,s),t.appendChild(l),i.appendChild(t),this):this}render(){const t=this.attr("showCode"),e=this.attr("mounted"),s=this.$parentElement,r=this.chapters;let l,n;return!s||r.length<1||(console.time("chapters"),this._paintEdge(),l=this.$el,n=this.$list,((t,e,s=!1)=>{const i=t=>document.querySelector(`#${t}`);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=A("span",{className:"outline-chapters__text"},[e.text]),h=A("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},[o]);let a,c,d,u;s&&(a=A("span",{className:"outline-chapters__code","data-id":l},[e.code]),h.insertBefore(a,h.firstChild)),c=A("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},[h]),-1===r?t.appendChild(c):(u=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(c):(d=A("ul",{id:"subject-"+r,className:"outline-chapters__subject"},[c]),u.appendChild(d)))}))})(n,r,t),O(l,"outline-chapters_hidden"),this.positionPlaceholder(this.active),console.timeEnd("chapters"),this.offsetTop=d(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),I("--outline-chapters-width",`${this.offsetWidth}px`)),i(e)&&e.call(this),this.onObserver()),this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=parseInt(Q(e,"padding-top"),10),n=parseInt(Q(e,"border-top-width"),10),o=parseInt(Q(s,"padding-top"),10),h=parseInt(Q(s,"margin-top"),10),a=parseInt(Q(s,"border-top-width"),10);let c,d=r.offsetHeight,u=0;return l&&(u+=l),o&&(u+=o),h&&(u+=h),n&&(u+=n),a&&(u+=a),c=d*t,i.style.cssText=`transform: translateY(${u+c}px);height:${d}px;`,this}highlight(t){const e=this.$el.querySelector(`#chapter__anchor-${t}`),s="outline-chapters_active";return e?(this.$active&&O(this.$active,s),this.active=parseInt(e.getAttribute("data-id"),10),this.$active=e,U(this.$active,s),this.positionPlaceholder(this.active),this):this}sticky(){const t=this.attr("afterSticky"),e="outline-chapters_fixed",s=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?U(s,e):O(s,e),i(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return I("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}show(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterOpened"),r=this.$el,l=this.$parentElement;return this.isInside()?(O(l,e),O(r,e),o((()=>{O(l,t),O(r,t)}),30)):O(r,e),this.closed=!1,i(s)&&s.call(this),this}hide(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterClosed"),r=this.$el,l=this.$parentElement;return this.isInside()?(U(l,t),U(r,t),o((()=>{U(l,e),U(r,e)}))):U(r,e),this.closed=!0,i(s)&&s.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&o((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(W.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.active=0,this.offsetTop=0,this.$active=null,this.closed=!1,this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),i(e)&&e.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let e=null;return this.Observer=((t,e={})=>{const s=e.root||null,r=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),a=n(s)?s:document;return s&&(o.root=s),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const s=t.getAttribute("data-id");if(this.playing)return!1;e&&clearTimeout(e),e=o((()=>{this.highlight(s)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),l=s.href.split("#")[1],n=document.querySelector(`#${l}`),h=d(n)-(e+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),o((()=>{this.playing=!1,T("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),o((()=>{this.scrollTo(h,u),this.highlight(r)}),10)):(this.scrollTo(h,u),this.highlight(r)),$(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=o((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),T("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=o((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),y(t,".outline-chapters__anchor","click",this.onSelect,this,!0),P(i,"scroll",this.onScroll,this,!0),this.isSticky()&&P(i,"resize",this.onResize,this,!0),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),b(e,"click",this.onSelect),b(r,"scroll",this.onScroll),this.isSticky()&&P(r,"resize",this.onResize),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}W.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const V=(t,e=!0)=>{const s=M(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=A("a",{className:"outline-toolbar__anchor",href:t.link},[s]),r=A("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return U(s,"outline-toolbar__icon"),e&&U(r,"outline-toolbar_rounded"),t.disabled&&U(r,"outline-toolbar_disabled"),r},J="outline-toolbar_disabled",Y="outline-toolbar_hidden";class G extends l{constructor(t){super(),this.attrs=G.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,H(i,s)?O(i,s):U(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),r=this.attr("placement"),l=document.createDocumentFragment(),n=document.createDocumentFragment();return L(),e.forEach((t=>{const e=V(t,s);l.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=A("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},[l]),n.appendChild(this.$el),document.body.appendChild(n),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),l=t.action,n=document.createDocumentFragment();let o;return r(t)?(s.push(t),n.appendChild(V(t))):w(t)&&t.forEach((t=>{n.appendChild(V(t))})),e.appendChild(n),l&&i(l.handler)&&(o=l.type||"click",y(e,`.${t.name}`,o,l.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,n,o,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(n=l.type||"click",o=l.handler),e?(O(h,J),n&&o&&y(s,`.${t}`,n,o)):(U(h,J),n&&o&&b(s,n,o)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(U(this.$el,J),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,O(this.$el,J),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),O(l,Y)}else O(r,Y),this.closed=!1,i(e)&&o((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),U(l,Y)}else U(r,Y),this.closed=!0,i(e)&&o((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(G.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(V(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const r=e.action;let l,n,o,h;if(this.disabled)return!1;r&&(n=r.handler,t(n)&&(h=n,r.handler=function(){T(h,e.name)},n=r.handler),l=r.type||"click",o=r.context),i(n)&&y(s,`.${e.name}`,l,n,o||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let r,l;if(this.disabled)return!1;s&&(l=s.handler,r=s.type||"click"),i(l)&&b(e,r,l)})),this}}G.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const K=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),X=(t,e,s=null)=>{const r=K();let l="symbol"==typeof t?t.toString():t;return i(e)?(v[l]||(v[l]=[]),v[l].push({topic:l,callback:e,context:s,token:r}),r):""},Z=t=>{if(!e(v,t))return!1;delete v[t]},tt=(t,e)=>{if(!_(t))return!1;e?(t=>{const e=Object.keys(v);if(!t||e.length<1)return!1;e.forEach((e=>{const s=v[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&Z(i)}))})(e):Z(t)};class et extends l{constructor(t){super(),this.attrs=et.DEFAULTS,this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,this.buttons=[],t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){const t=this.attr("scrollElement"),e=document.querySelector(t)||document.getElementById(t);return this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar(),e&&this.onToolbarUpdate({top:e.scrollTop,min:0,max:e.scrollHeight}),this}_renderPrint(){const e=this.attr("print"),s=this.attr("articleElement");let i;return e.element?(t(s)?i=document.querySelector(s):n(s)&&(i=s),U(i,"outline-article"),((e,s)=>{let i,r,l,h,a,c=s;t(e)?i=document.querySelector(e)||document.getElementById(e):n(e)&&(i=e),l=i.querySelector("h1"),n(s)&&(l=s),n(l)&&(c=l.innerText),r=A("article",{className:"outline-print"},[""]),r.innerHTML=i.innerHTML,l=A("h1",{className:"outline-print__title"},[c]),r.insertBefore(l,r.firstChild),document.body.appendChild(r),o((()=>{for(h=r.previousElementSibling;h;)a=h.tagName.toLowerCase(),"script"!==a&&"style"!==a&&U(h,"outline-print_sibling"),h=h.previousElementSibling;for(h=r.nextElementSibling;h;)a=h.tagName.toLowerCase(),"script"!==a&&"style"!==a&&U(h,"outline-print_sibling"),h=h.nextElementSibling}),350)})(e.element,e.title),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.attr("afterScroll"),o=this.attr("chapterTextFilter");return this.anchors=new j({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:n,chapterTextFilter:o}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("position"),n=this.attr("placement"),o=this.attr("afterSticky"),h=this.attr("afterToggle"),a=this.attr("afterScroll"),c=this.count();let d,u=this.attr("parentElement");return c<1||(d={scrollElement:s,showCode:r,position:l,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:o,afterToggle:h,afterScroll:a},"relative"===l?(this.drawer=new R({placement:n,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),u=this.drawer.$main):d.customClass=i,d.parentElement=u,this.chapters=new W(d)),this}_renderToolbar(){const t=this.attr("placement"),e=this.attr("homepage"),s=this.attr("git"),i=this.attr("tags"),r=this.attr("issues"),l=this.attr("tools"),n=this.count(),o={name:"homepage",icon:"homepage",size:20,link:e},h={name:"github",icon:"github",size:20,link:s},a={name:"tags",icon:"tags",size:20,link:i},c={name:"issues",icon:"issues",size:20,link:r},d={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},u=[];return u.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),n>0&&u.push(d),e&&u.push(o),s&&u.push(h),i&&u.push(a),r&&u.push(c),l?.length>0&&u.push(...l),u.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.buttons=[...u],this.toolbar=new G({placement:t,buttons:u}),this}addButton(t){const e=this.toolbar,s=this.buttons;return s.splice(-1,0,t),e.attr({buttons:s}),e.refresh(),this}removeButton(t){return this.toolbar.remove(t),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,s=this.chapters,r=this.count();return r>0&&(s.playing=!0),this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),r>0&&(s.highlight(0),s.playing=!1),i(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=a(this.attr("scrollElement")),s=this.toolbar,r=this.chapters,l=this.count(),n=Math.floor(e.scrollHeight-e.clientHeight);return l>0&&(r.playing=!0),this.scrollTo(n,(()=>{s.hide("down"),s.show("up"),l>0&&(r.highlight(l-1),r.playing=!1),i(t)&&t.call(s,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return c(s,t,e),this}toggle(){const t=this.attr("position"),e=this.toolbar,s=this.drawer,i=this.chapters;return this.count()<1||("relative"!==t?(i.toggle(),e.highlight("menu")):(e.toggle(),o((()=>{i.isInside()?i.toggle():s.toggle()})))),this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar,r=!1;const l=this.count();return this.removeListeners(),l>0&&(r=e.isOutside(),e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(et.DEFAULTS),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&r"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),r=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class l{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const l=this.attrs;return t(s)?i&&e(l,s)?(l[s]=i,this):l[s]:r(s)?(n=l,o=s,Object.keys(o).forEach((t=>{e(o,t)&&(n[t]=o[t])})),this):0===arguments.length?l:this;var n,o}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const n=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),o=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),h=t=>t*t,a=(e=null)=>{let s,i;return e?t(e)?i=document.querySelector(e):n(e)&&(i=e):(s=document.querySelectorAll("html,body"),i=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),i},c=(t,e,s)=>{const r=a(t);let l=r.scrollTop,n=0;const o=e-l,c=r.scrollHeight,d=e-c<=0?e:c,u=t=>(i(s)&&s(t),!1),p=()=>{if(n+=1,o<0){if(l-=h(n),r.scrollTop=l,l<=e)return r.scrollTop=e,u(e)}else if(l+=h(n),r.scrollTop=l,l>=d)return r.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)},d=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=d(t.offsetParent)),e},u=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},p=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,m=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],f=(t,e,s)=>{const i=m.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},g=function(e,s,i=!1){const r=t(e)?document.querySelector(e):e,l=r.childNodes,o=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(r,s);o.forEach((t=>{f(r,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&r&&l&&l.forEach((t=>{n(t)&&g(t,s,i)}))},b=(t,e,s)=>{if(!i(s))return g(t,e);f(t,e,s)},y=(t,e,s,i,r,l,n=!1)=>{const o=m.indexOf(s)>-1,h=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||i&&t===r)return t;if(t===r)break}while(t=p(t))})(a,e,t);let d=l||t;o.delegateTarget=c,!0===l&&(d=r),c&&(!0===n&&b(t,s,h),i.call(d,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},$=function(t){t.stopPropagation(),t.preventDefault()},v={},E=t=>e(v,t)&&v[t].length>0,_=(t,e=!0)=>e?E(t):(t=>{let e=E(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=E(t);return e})(t),T=(t,e,i=!0)=>{const r=t=>{if(!E(t))return!1;v[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},l=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),r(e);r(t),r("*")};if(!_(t))return!1;i?setTimeout(l,10):l()},w=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),S=['','','','','','','','',''],x=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return S.find((r=>{const l=s.exec(r)[1];return i.exec(l)[1]===e&&l===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):[...S],L=(e="")=>{const s=document.body;let i=document.querySelector("#outline-icons"),r=[];(e=>{if(!e)return!1;w(e)&&e.length>0?e.forEach((e=>{-1===S.indexOf(e)&&t(e)&&S.push(e)})):t(e)&&S.push(e)})(e),r=x(),i?i.innerHTML=r.join(""):(i=document.createElement("div"),i.innerHTML=``,s.insertBefore(i.firstChild,s.firstChild))},C=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),z=t=>{return!(!r(t)||!(n(t)||(t=>!(!r(t)||"[object NodeList]"!==s(t)))(t)||(e=t,r(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!r(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},k=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}},A=(s,i,l)=>{const n=document.createDocumentFragment(),o=document.createElement(s),h=e=>z(e)||t(e),a=e=>{let s;if(!h(e))return!1;z(e)?s=e:t(e)&&(s=document.createTextNode(e)),n.appendChild(s)};return r(i)?Object.keys(i).forEach((t=>{e(i,t)&&k(o,t,i[t])})):w(i)&&i.every((t=>h(t)))&&i.forEach((t=>{a(t)})),w(l)?l.forEach((t=>{a(t)})):a(l),o.appendChild(n),o},N=e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)},M=(e,s={})=>((e,s={})=>{const i=s.size||0,r=s.color||"",l=s.iconSet||"",n=w(i)?i[0]:i,o=w(i)?i[1]:i,h=i?`width:${n}px;height:${o}px;`:"",a=r?h+`color:${r}`:h,c=document.createElement("i");let d,u="",p="";return t(e)?(N(e)?p=e:(u=l&&"icon"!==l?`xlink:href="#${l}-icon-${e}"`:`xlink:href="#icon-${e}"`,p=``),c.className="outline-icon",c.innerHTML=p,N(e)&&(d=c.querySelector("svg"),d.setAttribute("aria-hidden","true"),d.setAttribute("xmlns","http://www.w3.org/2000/svg"),d.setAttribute("class","outline-icon__svg"),d.setAttribute("width","200"),d.setAttribute("height","200"),d.style.cssText=a),c):null})(e,s),H=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!n(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},O=(t,e)=>{let s,i=t.className;if(!i||!H(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=C(i.replace(e,"")),t.className=i)},D=(e,s=!0,i=!0)=>{const r="outline-heading",l=e.innerHTML;let n;if(e.innerHTML=l.replace(/^\d+(\.?\d+)*\s?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),O(e,r),!s)return!1;var o;n=e.querySelector(`.${r}__anchor`),i&&O(e,`${r}_start`),o=C(e.className),t(o)&&""===o&&e.removeAttribute("class"),e.removeChild(n)},F=(e,s=!0,r=null)=>{let l=1,n=0,o="";const h=[];return e.forEach(((e,s)=>{const a=e.tagName,c=a.replace(/h/i,"");let d=parseInt(c,10),u=-1;var p;d>l?(n+=1,u=1===n?-1:s-1):d===l||dn?1===d?(n=1,u=-1):u=h[s-1].pid:d<=n&&(1===d?n=1:(n-=l-d,n<=1&&(n=1)),u=1===n?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"",i(r)&&(o=r(o)),h.push({id:s,pid:u,level:n,rel:`heading-${s}`,text:o,tagName:a})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const s=e[`[${t.id}]`];if(!s||!w(s))return!1;s.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(h):h};class j extends l{constructor(t){super(),this.attrs=j.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){const s=this.attr("showCode")||!0;let r,l,o,h,c;return this.attr(e),c=this.attr("articleElement"),l=this.attr("scrollElement"),o=this.attr("selector"),r=this.attr("created"),t(c)?h=document.querySelector(c):n(c)&&(h=c),h?(this.$articleElement=h,this.$scrollElement=a(l),this.$headings=[...h.querySelectorAll(o)],this.$headings.length<1||(this.chapters=F(this.$headings,s,this.attr("chapterTextFilter")),i(r)&&r.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),s=this.attr("isAtStart"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.$headings,o=this.getChapters();return L(),n.forEach(((t,i)=>{const n=o[i].code;((t,e,s)=>{const i=document.createDocumentFragment(),r="outline-heading",l=s.hasAnchor||!0,n=s.isAtStart||!0,o=s.showCode||!1,h=s.chapterCode||"",a=s.anchorURL||"",c=`heading-${e}`,d={id:c,className:n?`${r} ${r}_start`:r,"data-id":e},u=Object.keys(d),p=C(t.innerHTML);let m,f;if(u.forEach((e=>{k(t,e,d[e])})),o&&(t.innerHTML=h+" "+p),!l)return!1;f=M("hash",{iconSet:"outline"}),m=A("a",{id:`anchor-${e}`,className:`${r}__anchor anchor-${e}`,href:a||`#${c}`,target:a?"_blank":"self","data-id":e},[f]),i.appendChild(m),t.appendChild(i)})(t,i,{hasAnchor:e,isAtStart:s,showCode:r,chapterCode:n,anchorURL:l})})),i(t)&&t.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),s=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return i(s)&&s.call(this),this.removeListeners(),l.forEach((s=>{D(s,t,e)})),this.attr(j.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],i(r)&&r.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),s=this.attr("afterScroll"),r=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,n=d(l)-(r+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(n,(()=>{i(s)&&s.call(this,"anchor"),o((()=>{T("toolbar:update",{top:n,min:0,max:a})}))})),e||$(t),this}addListeners(){const t=this.$articleElement;return y(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return b(t,"click",this.onAnchorTrigger),this}}j.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null};const U=(t,e)=>{let s,i;if(H(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},I=(t,e)=>{document.documentElement.style.setProperty(t,e)};let q=2e3;const B=t=>(t?q=t:q+=1,I("--outline-zIndex",`${q}`),q);class R extends l{constructor(t){super(),this.attrs=R.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),i(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),s=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),h=this.attr("autoHeight"),a=this.attr("customClass");let c,d,u,p,m,f,g,b;return L(),this.zIndex=B(),p=A("h2",{className:"outline-drawer__title"},[this.title]),this.$title=p,r&&(m=A("div",{className:"outline-drawer__close"},[M("close",{size:20})]),this.$close=m),u=A("header",{className:"outline-drawer__header"},[p,m]),this.$header=u,f=A("div",{className:"outline-drawer__main"},[""]),this.$main=f,o||U(f,"outline-drawer_full"),g=A("footer",{className:"outline-drawer__footer"},[""]),this.$footer=g,d=A("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${e} outline-drawer_closed`},[u,f,g]),this.$modal=d,n&&U(d,"outline-drawer_offset"),h&&U(d,"outline-drawer_auto"),a&&U(d,a),l&&(b=A("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=b),c=A("div",{className:"outline-drawer"},[d,b]),this.$el=c,document.body.appendChild(c),i(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return U(this.$el,"outline-drawer_opened"),O(e,"outline-drawer_closed"),U(e,"outline-drawer_opened"),o((()=>{this.closed=!1,i(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return O(e,"outline-drawer_opened"),U(e,"outline-drawer_closed"),o((()=>{O(this.$el,"outline-drawer_opened"),this.closed=!0,i(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),i(t)&&o((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let s=this.zIndex;return i(e)&&e.call(this),this.removeListeners(),this.attrs=R.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,B(s),this.zIndex=0,i(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&y(s,".outline-drawer__close","click",this.onClose,this,!0),e&&y(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(b(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}R.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const P=(t,e,s,r,l,n=!1)=>{const o=m.indexOf(e)>-1,h=function(i){let o=l||t;!0===l&&(o=r),!0===n&&b(t,e,h),s.call(o,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:h,data:r,context:l,capture:o}),s._delegateListener=h,t.addEventListener(e,h,o)},Q=(t,e)=>getComputedStyle(t)[e];class W extends l{constructor(t){super(),this.attrs=W.DEFAULTS,this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.closed=!1,this.active=0,this.offsetTop=0,this.offsetWidth=0,this.$active=null,this.scrollTimer=null,this.resizeTimer=null,this.playing=!1,this.Observer=null,t&&this.initialize(t)}initialize(e){let s,r,l,o;return this.attr(e),s=this.attr("created"),r=this.attr("parentElement"),l=this.attr("scrollElement"),t(r)?o=document.querySelector(r):n(r)&&(o=r),this.$parentElement=o,this.$scrollElement=a(l),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),s=this.attr("customClass"),i=this.$parentElement,r=[];let l,n,o,h,a=null;return i?(this.isInside()&&e&&(a=A("h2",{className:"outline-chapters__title"},[e]),this.$title=a,r.push(a)),o=A("ul",{className:"outline-chapters__list"},[""]),this.$list=o,h=A("div",{className:"outline-chapters__placeholder"},[""]),this.$placeholder=h,n=A("div",{className:"outline-chapters__main"},[o,h]),this.$main=n,r.push(n),l=A("nav",{id:"outline-chapters",className:"outline-chapters outline-chapters_hidden"},r),this.$el=l,this.isSticky()&&(this.calculateStickyHeight(),U(l,"outline-chapters_sticky")),s&&U(l,s),t.appendChild(l),i.appendChild(t),this):this}render(){const t=this.attr("showCode"),e=this.attr("mounted"),s=this.$parentElement,r=this.chapters;let l,n;return!s||r.length<1||(this._paintEdge(),l=this.$el,n=this.$list,((t,e,s=!1)=>{const i=t=>document.querySelector(`#${t}`);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=A("span",{className:"outline-chapters__text"},[e.text]),h=A("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},[o]);let a,c,d,u;s&&(a=A("span",{className:"outline-chapters__code","data-id":l},[e.code]),h.insertBefore(a,h.firstChild)),c=A("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},[h]),-1===r?t.appendChild(c):(u=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(c):(d=A("ul",{id:"subject-"+r,className:"outline-chapters__subject"},[c]),u.appendChild(d)))}))})(n,r,t),O(l,"outline-chapters_hidden"),this.positionPlaceholder(this.active),this.offsetTop=d(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),I("--outline-chapters-width",`${this.offsetWidth}px`)),i(e)&&e.call(this),this.onObserver()),this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=parseInt(Q(e,"padding-top"),10),n=parseInt(Q(e,"border-top-width"),10),o=parseInt(Q(s,"padding-top"),10),h=parseInt(Q(s,"margin-top"),10),a=parseInt(Q(s,"border-top-width"),10);let c,d=r.offsetHeight,u=0;return l&&(u+=l),o&&(u+=o),h&&(u+=h),n&&(u+=n),a&&(u+=a),c=d*t,i.style.cssText=`transform: translateY(${u+c}px);height:${d}px;`,this}highlight(t){const e=this.$el.querySelector(`#chapter__anchor-${t}`),s="outline-chapters_active";return e?(this.$active&&O(this.$active,s),this.active=parseInt(e.getAttribute("data-id"),10),this.$active=e,U(this.$active,s),this.positionPlaceholder(this.active),this):this}sticky(){const t=this.attr("afterSticky"),e="outline-chapters_fixed",s=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?U(s,e):O(s,e),i(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return I("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}show(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterOpened"),r=this.$el,l=this.$parentElement;return this.isInside()?(O(l,e),O(r,e),o((()=>{O(l,t),O(r,t)}),30)):O(r,e),this.closed=!1,i(s)&&s.call(this),this}hide(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterClosed"),r=this.$el,l=this.$parentElement;return this.isInside()?(U(l,t),U(r,t),o((()=>{U(l,e),U(r,e)}))):U(r,e),this.closed=!0,i(s)&&s.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&o((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(W.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.active=0,this.offsetTop=0,this.$active=null,this.closed=!1,this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),i(e)&&e.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let e=null;return this.Observer=((t,e={})=>{const s=e.root||null,r=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),a=n(s)?s:document;return s&&(o.root=s),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const s=t.getAttribute("data-id");if(this.playing)return!1;e&&clearTimeout(e),e=o((()=>{this.highlight(s)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),l=s.href.split("#")[1],n=document.querySelector(`#${l}`),h=d(n)-(e+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),o((()=>{this.playing=!1,T("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),o((()=>{this.scrollTo(h,u),this.highlight(r)}),10)):(this.scrollTo(h,u),this.highlight(r)),$(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=o((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),T("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=o((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),y(t,".outline-chapters__anchor","click",this.onSelect,this,!0),P(i,"scroll",this.onScroll,this,!0),this.isSticky()&&P(i,"resize",this.onResize,this,!0),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),b(e,"click",this.onSelect),b(r,"scroll",this.onScroll),this.isSticky()&&P(r,"resize",this.onResize),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}W.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const V=(t,e=!0)=>{const s=M(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=A("a",{className:"outline-toolbar__anchor",href:t.link},[s]),r=A("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return U(s,"outline-toolbar__icon"),e&&U(r,"outline-toolbar_rounded"),t.disabled&&U(r,"outline-toolbar_disabled"),r},J="outline-toolbar_disabled",Y="outline-toolbar_hidden";class G extends l{constructor(t){super(),this.attrs=G.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,H(i,s)?O(i,s):U(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),r=this.attr("placement"),l=document.createDocumentFragment(),n=document.createDocumentFragment();return L(),e.forEach((t=>{const e=V(t,s);l.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=A("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},[l]),n.appendChild(this.$el),document.body.appendChild(n),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),l=t.action,n=document.createDocumentFragment();let o;return r(t)?(s.push(t),n.appendChild(V(t))):w(t)&&t.forEach((t=>{n.appendChild(V(t))})),e.appendChild(n),l&&i(l.handler)&&(o=l.type||"click",y(e,`.${t.name}`,o,l.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,n,o,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(n=l.type||"click",o=l.handler),e?(O(h,J),n&&o&&y(s,`.${t}`,n,o)):(U(h,J),n&&o&&b(s,n,o)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(U(this.$el,J),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,O(this.$el,J),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),O(l,Y)}else O(r,Y),this.closed=!1,i(e)&&o((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),U(l,Y)}else U(r,Y),this.closed=!0,i(e)&&o((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(G.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(V(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const r=e.action;let l,n,o,h;if(this.disabled)return!1;r&&(n=r.handler,t(n)&&(h=n,r.handler=function(){T(h,e.name)},n=r.handler),l=r.type||"click",o=r.context),i(n)&&y(s,`.${e.name}`,l,n,o||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let r,l;if(this.disabled)return!1;s&&(l=s.handler,r=s.type||"click"),i(l)&&b(e,r,l)})),this}}G.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const K=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),X=(t,e,s=null)=>{const r=K();let l="symbol"==typeof t?t.toString():t;return i(e)?(v[l]||(v[l]=[]),v[l].push({topic:l,callback:e,context:s,token:r}),r):""},Z=t=>{if(!e(v,t))return!1;delete v[t]},tt=(t,e)=>{if(!_(t))return!1;e?(t=>{const e=Object.keys(v);if(!t||e.length<1)return!1;e.forEach((e=>{const s=v[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&Z(i)}))})(e):Z(t)};class et extends l{constructor(t){super(),this.attrs=et.DEFAULTS,this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,this.buttons=[],t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){const t=this.attr("scrollElement"),e=document.querySelector(t)||document.getElementById(t);return this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar(),e&&this.onToolbarUpdate({top:e.scrollTop,min:0,max:e.scrollHeight}),this}_renderPrint(){const e=this.attr("print"),s=this.attr("articleElement");let i;return e.element?(t(s)?i=document.querySelector(s):n(s)&&(i=s),U(i,"outline-article"),((e,s)=>{let i,r,l,h,a,c=s;t(e)?i=document.querySelector(e)||document.getElementById(e):n(e)&&(i=e),l=i.querySelector("h1"),n(s)&&(l=s),n(l)&&(c=l.innerText),r=A("article",{className:"outline-print"},[""]),r.innerHTML=i.innerHTML,l=A("h1",{className:"outline-print__title"},[c]),r.insertBefore(l,r.firstChild),document.body.appendChild(r),o((()=>{for(h=r.previousElementSibling;h;)a=h.tagName.toLowerCase(),"script"!==a&&"style"!==a&&U(h,"outline-print_sibling"),h=h.previousElementSibling;for(h=r.nextElementSibling;h;)a=h.tagName.toLowerCase(),"script"!==a&&"style"!==a&&U(h,"outline-print_sibling"),h=h.nextElementSibling}),350)})(e.element,e.title),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.attr("afterScroll"),o=this.attr("chapterTextFilter");return this.anchors=new j({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:n,chapterTextFilter:o}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("position"),n=this.attr("placement"),o=this.attr("afterSticky"),h=this.attr("afterToggle"),a=this.attr("afterScroll"),c=this.count();let d,u=this.attr("parentElement");return c<1||(d={scrollElement:s,showCode:r,position:l,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:o,afterToggle:h,afterScroll:a},"relative"===l?(this.drawer=new R({placement:n,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),u=this.drawer.$main):d.customClass=i,d.parentElement=u,this.chapters=new W(d)),this}_renderToolbar(){const t=this.attr("placement"),e=this.attr("homepage"),s=this.attr("git"),i=this.attr("tags"),r=this.attr("issues"),l=this.attr("tools"),n=this.count(),o={name:"homepage",icon:"homepage",size:20,link:e},h={name:"github",icon:"github",size:20,link:s},a={name:"tags",icon:"tags",size:20,link:i},c={name:"issues",icon:"issues",size:20,link:r},d={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},u=[];return u.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),n>0&&u.push(d),e&&u.push(o),s&&u.push(h),i&&u.push(a),r&&u.push(c),l?.length>0&&u.push(...l),u.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.buttons=[...u],this.toolbar=new G({placement:t,buttons:u}),this}addButton(t){const e=this.toolbar,s=this.buttons;return s.splice(-1,0,t),e.attr({buttons:s}),e.refresh(),this}removeButton(t){return this.toolbar.remove(t),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,s=this.chapters,r=this.count();return r>0&&(s.playing=!0),this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),r>0&&(s.highlight(0),s.playing=!1),i(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=a(this.attr("scrollElement")),s=this.toolbar,r=this.chapters,l=this.count(),n=Math.floor(e.scrollHeight-e.clientHeight);return l>0&&(r.playing=!0),this.scrollTo(n,(()=>{s.hide("down"),s.show("up"),l>0&&(r.highlight(l-1),r.playing=!1),i(t)&&t.call(s,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return c(s,t,e),this}toggle(){const t=this.attr("position"),e=this.toolbar,s=this.drawer,i=this.chapters;return this.count()<1||("relative"!==t?(i.toggle(),e.highlight("menu")):(e.toggle(),o((()=>{i.isInside()?i.toggle():s.toggle()})))),this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar,r=!1;const l=this.count();return this.removeListeners(),l>0&&(r=e.isOutside(),e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(et.DEFAULTS),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&r {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from '../types/isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n let $rootElements\n let $scrollElement\n\n if (!scrollElement) {\n $rootElements = document.querySelectorAll('html,body')\n $scrollElement =\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n ? $rootElements[0]\n : $rootElements[1]\n } else {\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n }\n\n return $scrollElement\n}\n\nexport default _getScrollElement\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n const $scrollElement = _getScrollElement(scrollElement)\n let scrollTop = $scrollElement.scrollTop\n let step = 0\n const distance = top - scrollTop\n const MAX_HEIGHT = $scrollElement.scrollHeight\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n const stop = (top) => {\n if (isFunction(afterStop)) {\n afterStop(top)\n }\n\n return false\n }\n const play = () => {\n step += 1\n\n // 向上滚动\n if (distance < 0) {\n scrollTop -= easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop <= top) {\n $scrollElement.scrollTop = top\n return stop(top)\n }\n } else {\n scrollTop += easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop >= MAX_TOP) {\n $scrollElement.scrollTop = MAX_TOP\n return stop(MAX_TOP)\n }\n }\n\n requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} data - (必须)数据对象\n * @param {Boolean} async - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg =\n `` +\n `` +\n ``\n }\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n if (isSVG(name)) {\n $svg = $icon.querySelector('svg')\n $svg.setAttribute('aria-hidden', 'true')\n $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n $svg.setAttribute('class', 'outline-icon__svg')\n $svg.setAttribute('width', '200')\n $svg.setAttribute('height', '200')\n $svg.style = cssRules\n }\n\n return $icon\n}\n\nexport default createElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import removeClass from './utils/dom/removeClass'\nimport isEmpty from './utils/types/isEmpty'\nimport trim from './utils/lang/trim'\n\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\n let $anchor\n\n $heading.innerHTML = text.replace(pattern, '')\n $heading.removeAttribute('id')\n $heading.removeAttribute('data-id')\n\n removeClass($heading, CLS_HEADING)\n\n if (!hasAnchor) {\n return false\n }\n\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\n\n if (isAtStart) {\n removeClass($heading, `${CLS_HEADING}_start`)\n }\n\n if (isEmpty(trim($heading.className))) {\n $heading.removeAttribute('class')\n }\n\n $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\n","import isString from './isString'\n/**\n * 检测数据是否为空字符串\n * ========================================================================\n * @method isEmpty\n * @param {String} str\n * @returns {boolean}\n */\nconst isEmpty = (str) => {\n return isString(str) && str === ''\n}\n\nexport default isEmpty\n","import trim from './utils/lang/trim'\nimport stripTags from './utils/lang/stripTags'\nimport isFunction from './utils/types/isFunction'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\n/**\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\n * ========================================================================\n * @method getChapters\n * @param {Array} headings\n * @param {Boolean} [showCode]\n * @param {Function} [chapterTextFilter]\n * @return {*|*[]}\n */\nconst getChapters = (headings, showCode = true, chapterTextFilter = null) => {\n let previous = 1\n let level = 0\n let text = ''\n const chapters = []\n\n headings.forEach((heading, i) => {\n const tagName = heading.tagName\n const headingLevel = tagName.replace(/h/i, '')\n let current = parseInt(headingLevel, 10)\n let pid = -1\n\n // 场景1:当前标题是前一个标题的子标题\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\n // h2 (前一个标题)\n // h3 (当前标题)\n if (current > previous) {\n level += 1\n\n // 第一层级的 pid 是 -1\n if (level === 1) {\n pid = -1\n } else {\n pid = i - 1\n }\n }\n // 场景2:当前标题和前一个标题层级相同\n // 当前标题的(标题标签)序号 = 前一个标题的序号\n // h2 (前一个标题)\n // h2 (当前标题)\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\n // h2\n // h4 (前一个标题)\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\n else if (current === previous || (current < previous && current > level)) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n pid = -1\n } else {\n pid = chapters[i - 1].pid\n }\n }\n // 场景3:当前标题比前一个标题层级高\n else if (current <= level) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n } else {\n level = level - (previous - current)\n\n if (level <= 1) {\n level = 1\n }\n }\n\n // 第一级的标题\n if (level === 1) {\n pid = -1\n } else {\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\n }\n }\n\n previous = current\n\n text = stripTags(trim(heading.innerHTML))\n\n if (isFunction(chapterTextFilter)) {\n text = chapterTextFilter(text)\n }\n\n chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text,\n tagName\n })\n })\n\n return showCode ? _getChaptersWithCode(chapters) : chapters\n}\n\nexport default getChapters\n","import isString from '../types/isString'\n\n/**\n * 过滤所有 HTML 标签\n * ========================================================================\n * @method stripTags\n * @param {string} str\n * @returns {string}\n */\nconst stripTags = (str) => {\n if (!isString(str)) {\n return ''\n }\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\n}\n\nexport default stripTags\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\n let previous = chapters[index - 1]\n let pid\n let i\n\n for (i = 0; i < differ; i += 1) {\n pid = previous.pid\n previous = chapters[pid]\n }\n\n pid = previous.pid\n\n return pid\n}\n\nexport default _getChapterParentIdByDiffer\n","import isArray from './utils/types/isArray'\n\nconst _getChaptersWithCode = (chapters) => {\n const groups = {}\n const cb = (o) => {\n return [o.pid]\n }\n\n chapters.forEach((o) => {\n const group = JSON.stringify(cb(o))\n\n groups[group] = groups[group] || []\n groups[group].push(o)\n\n o.index = groups[group].length\n if (o.pid === -1) {\n o.code = String(o.index)\n }\n })\n\n Object.keys(groups).forEach((group) => {\n groups[group].forEach((c) => {\n const subjects = groups[`[${c.id}]`]\n if (!subjects || !isArray(subjects)) {\n return false\n }\n subjects.forEach((o) => {\n o.code = c.code + '.' + o.index\n })\n })\n })\n\n return chapters\n}\n\nexport default _getChaptersWithCode\n","import Base from './base'\n\n// 在文章的标题生成 anchor 链接\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport toTree from './utils/lang/toTree'\nimport later from './utils/lang/later'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport offsetTop from './utils/dom/offsetTop'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport publish from './utils/observer/emit'\nimport paint from './utils/icons/paint'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n const showCode = this.attr('showCode') || true\n let created\n let scrollElement\n let selector\n let $articleElement\n let articleElement\n\n this.attr(options)\n articleElement = this.attr('articleElement')\n scrollElement = this.attr('scrollElement')\n selector = this.attr('selector')\n created = this.attr('created')\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n if (!$articleElement) {\n return this\n }\n\n this.$articleElement = $articleElement\n this.$scrollElement = _getScrollElement(scrollElement)\n this.$headings = [...$articleElement.querySelectorAll(selector)]\n\n if (this.$headings.length < 1) {\n return this\n }\n\n this.chapters = getChapters(\n this.$headings,\n showCode,\n this.attr('chapterTextFilter')\n )\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n getChapters(isTreeStructured = false) {\n const chapters = this.chapters\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\n }\n\n count() {\n return this.chapters.length\n }\n\n render() {\n const mounted = this.attr('mounted')\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const $headings = this.$headings\n const chapters = this.getChapters()\n\n paint()\n\n $headings.forEach(($heading, i) => {\n const chapterCode = chapters[i].code\n _updateHeading($heading, i, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n destroy() {\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n onAnchorTrigger(evt) {\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const $heading = $anchor.parentNode\n const top = offsetTop($heading) - (stickyHeight + 10)\n const $scrollElement = this.$scrollElement\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'anchor')\n }\n\n later(() => {\n publish('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.scrollTo(top, after)\n\n if (!anchorURL) {\n stop(evt)\n }\n\n return this\n }\n\n addListeners() {\n const $articleElement = this.$articleElement\n\n on(\n $articleElement,\n '.outline-heading__anchor',\n 'click',\n this.onAnchorTrigger,\n this,\n true\n )\n\n return this\n }\n\n removeListeners() {\n const $articleElement = this.$articleElement\n\n off($articleElement, 'click', this.onAnchorTrigger)\n\n return this\n }\n}\n\nAnchors.DEFAULTS = {\n scrollElement: 'html,body',\n articleElement: '#article',\n selector: 'h1,h2,h3,h4,h5,h6',\n stickyHeight: 0,\n anchorURL: '',\n hasAnchor: true,\n isAtStart: true,\n showCode: false,\n created: null,\n mounted: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n chapterTextFilter: null\n}\n\nexport default Anchors\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttribute from './utils/dom/setAttribute'\n\nimport icon from './utils/icons/icon'\n\nconst _updateHeading = ($heading, i, options) => {\n const $fragment = document.createDocumentFragment()\n const CLS_HEADING = 'outline-heading'\n const hasAnchor = options.hasAnchor || true\n const isAtStart = options.isAtStart || true\n const showCode = options.showCode || false\n const chapterCode = options.chapterCode || ''\n const anchorURL = options.anchorURL || ''\n const headingId = `heading-${i}`\n const attrs = {\n id: headingId,\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\n 'data-id': i\n }\n const keys = Object.keys(attrs)\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n keys.forEach((prop) => {\n setAttribute($heading, prop, attrs[prop])\n })\n\n if (showCode) {\n $heading.innerHTML = chapterCode + ' ' + text\n }\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = icon('hash', { iconSet: 'outline' })\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL || `#${headingId}`,\n target: anchorURL ? '_blank' : 'self',\n 'data-id': i\n },\n [$icon]\n )\n $fragment.appendChild($anchor)\n $heading.appendChild($fragment)\n}\n\nexport default _updateHeading\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\n\nlet index = 2000\n\nconst zIndex = (idx) => {\n if (idx) {\n index = idx\n } else {\n index += 1\n }\n\n setProperty('--outline-zIndex', `${index}`)\n\n return index\n}\n\nexport default zIndex\n","import Base from './base'\n\nimport later from './utils/lang/later'\nimport isFunction from './utils/types/isFunction'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport paint from './utils/icons/paint'\nimport icon from './utils/icons/icon'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = true\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n\n this.title = this.attr('title')\n created = this.attr('created')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n return this\n }\n\n setTitle(title) {\n this.attr('title', title)\n this.title = title\n this.$title.innerHTML = title\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n render() {\n const mounted = this.attr('mounted')\n const size = this.attr('size')\n const placement = this.attr('placement')\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const hasOffset = this.attr('hasOffset')\n const hasPadding = this.attr('hasPadding')\n const autoHeight = this.attr('autoHeight')\n const customClass = this.attr('customClass')\n let $el\n let $modal\n let $header\n let $title\n let $close\n let $main\n let $footer\n let $overlay\n\n paint()\n this.zIndex = zIndex()\n\n $title = createElement(\n 'h2',\n {\n className: 'outline-drawer__title'\n },\n [this.title]\n )\n this.$title = $title\n\n if (hasClose) {\n $close = createElement(\n 'div',\n {\n className: 'outline-drawer__close'\n },\n [icon('close', { size: 20 })]\n )\n this.$close = $close\n }\n\n $header = createElement(\n 'header',\n {\n className: 'outline-drawer__header'\n },\n [$title, $close]\n )\n this.$header = $header\n\n $main = createElement(\n 'div',\n {\n className: 'outline-drawer__main'\n },\n ['']\n )\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement(\n 'footer',\n {\n className: 'outline-drawer__footer'\n },\n ['']\n )\n this.$footer = $footer\n\n $modal = createElement(\n 'div',\n {\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\n },\n [$header, $main, $footer]\n )\n this.$modal = $modal\n\n if (hasOffset) {\n addClass($modal, 'outline-drawer_offset')\n }\n\n if (autoHeight) {\n addClass($modal, 'outline-drawer_auto')\n }\n\n if (customClass) {\n addClass($modal, customClass)\n }\n\n if (hasOverlay) {\n $overlay = createElement(\n 'div',\n {\n className: 'outline-drawer__overlay'\n },\n ['']\n )\n this.$overlay = $overlay\n }\n\n $el = createElement(\n 'div',\n {\n className: `outline-drawer`\n },\n [$modal, $overlay]\n )\n this.$el = $el\n document.body.appendChild($el)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n open() {\n const opened = this.attr('afterOpened')\n const $modal = this.$modal\n\n addClass(this.$el, 'outline-drawer_opened')\n removeClass($modal, 'outline-drawer_closed')\n addClass($modal, 'outline-drawer_opened')\n\n later(() => {\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n })\n\n return this\n }\n\n close() {\n const closed = this.attr('afterClosed')\n const $modal = this.$modal\n\n removeClass($modal, 'outline-drawer_opened')\n addClass($modal, 'outline-drawer_closed')\n\n later(() => {\n removeClass(this.$el, 'outline-drawer_opened')\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n })\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const closed = this.isClosed()\n\n if (closed) {\n this.open()\n } else {\n this.close()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n afterToggle.call(this, closed)\n })\n }\n\n return this\n }\n\n destroy() {\n const afterDestroy = this.attr('afterDestroy')\n const beforeDestroy = this.attr('beforeDestroy')\n let index = this.zIndex\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = false\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n\n index -= 1\n zIndex(index)\n this.zIndex = 0\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n addListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay) {\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (!hasClose && !hasOverlay) {\n return this\n }\n\n off($el, 'click', this.onClose)\n\n return this\n }\n\n onClose() {\n this.close()\n return this\n }\n}\n\nDrawer.DEFAULTS = {\n placement: 'rtl',\n title: '标题',\n size: 'regular',\n hasClose: true,\n hasOverlay: true,\n hasOffset: false,\n hasPadding: true,\n autoHeight: true,\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterToggle: null\n}\n\nexport default Drawer\n","import isFunction from '../types/isFunction'\nimport off from './off'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定事件\n * ========================================================================\n * @method at\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst at = (el, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n const listener = function (evt) {\n let overrideContext = context || el\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n\n if (!isFunction(fn)) {\n return false\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default at\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport later from './utils/lang/later'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport createElement from './utils/dom/createElement'\nimport scrollTo from './utils/dom/scrollTo'\nimport addClass from './utils/dom/addClass'\nimport intersection from './utils/dom/intersection'\nimport removeClass from './utils/dom/removeClass'\nimport offsetTop from './utils/dom/offsetTop'\nimport getStyle from './utils/dom/getStyle'\nimport setProperty from './utils/dom/setProperty'\nimport publish from './utils/observer/emit'\n\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = Chapters.DEFAULTS\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.chapters = []\n this.closed = false\n this.active = 0\n this.offsetTop = 0\n this.offsetWidth = 0\n this.$active = null\n this.scrollTimer = null\n this.resizeTimer = null\n this.playing = false\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n let parentElement\n let scrollElement\n let $parent\n\n this.attr(options)\n created = this.attr('created')\n parentElement = this.attr('parentElement')\n scrollElement = this.attr('scrollElement')\n\n if (isString(parentElement)) {\n $parent = document.querySelector(parentElement)\n } else if (isElement(parentElement)) {\n $parent = parentElement\n }\n this.$parentElement = $parent\n this.$scrollElement = _getScrollElement(scrollElement)\n\n this.chapters = this.attr('chapters')\n this.closed = this.attr('closed')\n this.active = this.attr('active')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n if (this.chapters.length < 1) {\n return this\n }\n\n this.render().addListeners()\n\n this.$active = document.querySelector(`#chapter-${this.active}`)\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n isSticky() {\n const position = this.attr('position')\n return position === 'sticky'\n }\n\n isFixed() {\n const position = this.attr('position')\n return position === 'fixed'\n }\n\n isInside() {\n return this.isFixed() || this.isSticky()\n }\n\n isOutside() {\n return !this.isInside()\n }\n\n _paintEdge() {\n const $fragment = document.createDocumentFragment()\n const STICKY = 'outline-chapters_sticky'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\n const contents = []\n let $title = null\n let $el\n let $main\n let $list\n let $placeholder\n\n if (!$parentElement) {\n return this\n }\n\n if (this.isInside() && title) {\n $title = createElement(\n 'h2',\n {\n className: 'outline-chapters__title'\n },\n [title]\n )\n this.$title = $title\n contents.push($title)\n }\n\n $list = createElement(\n 'ul',\n {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list`\n },\n ['']\n )\n this.$list = $list\n\n $placeholder = createElement(\n 'div',\n {\n className: 'outline-chapters__placeholder'\n },\n ['']\n )\n this.$placeholder = $placeholder\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n [$list, $placeholder]\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: `outline-chapters ${HIDDEN}`\n },\n contents\n )\n this.$el = $el\n\n if (this.isSticky()) {\n this.calculateStickyHeight()\n addClass($el, STICKY)\n }\n\n if (customClass) {\n addClass($el, customClass)\n }\n $fragment.appendChild($el)\n $parentElement.appendChild($fragment)\n\n return this\n }\n\n render() {\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n const chapters = this.chapters\n let $el\n let $list\n\n if (!$parentElement || chapters.length < 1) {\n return this\n }\n\n console.time('chapters')\n this._paintEdge()\n\n $el = this.$el\n $list = this.$list\n _paintChapters($list, chapters, showCode)\n removeClass($el, HIDDEN)\n this.positionPlaceholder(this.active)\n console.timeEnd('chapters')\n\n this.offsetTop = offsetTop($el)\n this.offsetWidth = $el.offsetWidth\n\n if (this.isFixed()) {\n this.sticky()\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n this.onObserver()\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\n const placeholderBorderTop = parseInt(\n getStyle($list, 'border-top-width'),\n 10\n )\n let height = $anchor.offsetHeight\n let offsetTop = 0\n let top\n\n if (mainPaddingTop) {\n offsetTop += mainPaddingTop\n }\n\n if (placeholderPaddingTop) {\n offsetTop += placeholderPaddingTop\n }\n\n if (placeholderMarginTop) {\n offsetTop += placeholderMarginTop\n }\n\n if (mainBorderTop) {\n offsetTop += mainBorderTop\n }\n\n if (placeholderBorderTop) {\n offsetTop += placeholderBorderTop\n }\n\n top = height * index\n // top:calc(${offsetTop}px + ${top}px);\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const HIGHLIGHT = 'outline-chapters_active'\n\n if (!$anchor) {\n return this\n }\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n this.$active = $anchor\n addClass(this.$active, HIGHLIGHT)\n\n this.positionPlaceholder(this.active)\n\n return this\n }\n\n sticky() {\n const afterSticky = this.attr('afterSticky')\n const FIXED = 'outline-chapters_fixed'\n const $el = this.$el\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (!this.isFixed()) {\n return this\n }\n\n isStickying = scrollTop >= top\n\n if (isStickying) {\n addClass($el, FIXED)\n } else {\n removeClass($el, FIXED)\n }\n\n if (isFunction(afterSticky)) {\n afterSticky.call(this, this.isClosed(), isStickying)\n }\n\n return this\n }\n\n calculateStickyHeight() {\n const documentElement = document.documentElement\n const height = Math.max(\n documentElement.clientHeight || 0,\n window.innerHeight || 0\n )\n setProperty('--outline-sticky-height', `${height}px`)\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n show() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const opened = this.attr('afterOpened')\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n removeClass($parent, HIDDEN)\n removeClass($el, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n removeClass($el, FOLDED)\n }, 30)\n } else {\n removeClass($el, HIDDEN)\n }\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n\n return this\n }\n\n hide() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const closed = this.attr('afterClosed')\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n addClass($parent, FOLDED)\n addClass($el, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n addClass($el, HIDDEN)\n })\n } else {\n addClass($el, HIDDEN)\n }\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n isStickying = scrollTop >= top\n afterToggle.call(this, this.isClosed(), isStickying)\n })\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.$active = null\n this.closed = false\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n this.scrollTimer = null\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n this.resizeTimer = null\n }\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\n\n this.Observer = intersection(\n ($heading) => {\n const id = $heading.getAttribute('data-id')\n\n if (this.playing) {\n return false\n }\n\n if (timer) {\n clearTimeout(timer)\n }\n\n timer = later(() => {\n this.highlight(id)\n }, 100)\n },\n {\n selector,\n context: this\n }\n )\n\n return this\n }\n\n onSelect(evt) {\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const id = $anchor.getAttribute('data-id')\n const headingId = $anchor.href.split('#')[1]\n const $heading = document.querySelector(`#${headingId}`)\n const top = offsetTop($heading) - (stickyHeight + 10)\n const min = 0\n const max = this.$scrollElement.scrollHeight\n const afterScroll = this.attr('afterScroll')\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'chapter')\n }\n\n later(() => {\n this.playing = false\n publish('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.playing = true\n if (this.isFixed()) {\n this.sticky()\n later(() => {\n this.scrollTo(top, after)\n this.highlight(id)\n }, 10)\n } else {\n this.scrollTo(top, after)\n this.highlight(id)\n }\n\n stop(evt)\n\n return this\n }\n\n onScroll() {\n const $scrollElement = this.$scrollElement\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n }\n\n this.scrollTimer = later(() => {\n const top = $scrollElement.scrollTop\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n\n if (this.isFixed()) {\n this.sticky()\n }\n\n publish('toolbar:update', {\n top,\n min,\n max\n })\n }, 100)\n\n return this\n }\n\n onResize() {\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n }\n\n this.resizeTimer = later(() => {\n this.calculateStickyHeight()\n })\n\n return this\n }\n\n addListeners() {\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\n at($element, 'scroll', this.onScroll, this, true)\n if (this.isSticky()) {\n at($element, 'resize', this.onResize, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const selector = this.attr('selector')\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n off($el, 'click', this.onSelect)\n off($element, 'scroll', this.onScroll)\n\n if (this.isSticky()) {\n at($element, 'resize', this.onResize)\n }\n\n if (this.Observer) {\n document.querySelectorAll(selector).forEach((section) => {\n this.Observer.unobserve(section)\n })\n }\n\n return this\n }\n}\n\nChapters.DEFAULTS = {\n parentElement: '',\n scrollElement: '',\n selector: '.outline-heading',\n active: 0,\n closed: false,\n showCode: true,\n position: 'relative',\n stickyHeight: 0,\n chapters: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterSticky: null\n}\n\nexport default Chapters\n","import createElement from './utils/dom/createElement'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const byId = (id) => document.querySelector(`#${id}`)\n\n chapters.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n [chapter.text]\n )\n const $link = createElement(\n 'a',\n {\n id: `chapter__anchor-${id}`,\n className: 'outline-chapters__anchor',\n href: '#' + rel,\n rel: rel,\n 'data-id': id\n },\n [$text]\n )\n let $code\n let $li\n let $ul\n let $parent\n\n if (showCode) {\n $code = createElement(\n 'span',\n {\n className: 'outline-chapters__code',\n 'data-id': id\n },\n [chapter.code]\n )\n\n $link.insertBefore($code, $link.firstChild)\n }\n\n $li = createElement(\n 'li',\n {\n id: `chapter-${id}`,\n className: 'outline-chapters__item',\n 'data-id': id\n },\n [$link]\n )\n\n if (pid === -1) {\n $list.appendChild($li)\n } else {\n $parent = byId(`chapter-${pid}`)\n $ul = byId(`subject-${pid}`)\n\n if (!$ul) {\n $ul = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n [$li]\n )\n\n $parent.appendChild($ul)\n } else {\n $ul.appendChild($li)\n }\n }\n })\n}\n\nexport default _paintChapters\n","import isFunction from '../types/isFunction'\nimport isElement from '../types/isElement'\n\n/**\n * 通用的 IntersectionObserver 观察者处理器\n * ========================================================================\n * @method intersection\n * @param {Function} fn\n * @param {Object} [props]\n * @param {Object|HTMLElement} [props.root]\n * @param {String} [props.selector]\n * @param {Object} [props.context]\n * @param {String} [props.attr]\n * @param {String} [props.rootMargin]\n */\nconst intersection = (fn, props = {}) => {\n const root = props.root || null\n const selector = props.selector || '.outline-heading'\n const context = props.context || null\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\n const options = {\n rootMargin: rootMargin\n }\n const Observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.intersectionRatio > 0) {\n if (isFunction(fn)) {\n fn.call(context || entry.target, entry.target)\n }\n }\n })\n }, options)\n const $root = isElement(root) ? root : document\n\n if (root) {\n options.root = root\n }\n\n $root.querySelectorAll(selector).forEach((section) => {\n Observer.observe(section)\n })\n\n return Observer\n}\n\nexport default intersection\n","import icon from './utils/icons/icon'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = icon(button.icon, {\n iconSet: button.iconSet || 'outline',\n color: button.color || '',\n size: button.size\n })\n const $anchor = createElement(\n 'a',\n {\n className: `outline-toolbar__anchor`,\n href: button.link\n },\n [$icon]\n )\n const $button = createElement(\n 'div',\n {\n className: `outline-toolbar__button ${button.name}`\n },\n [button.link ? $anchor : $icon]\n )\n\n addClass($icon, 'outline-toolbar__icon')\n\n if (rounded) {\n addClass($button, 'outline-toolbar_rounded')\n }\n\n if (button.disabled) {\n addClass($button, 'outline-toolbar_disabled')\n }\n\n return $button\n}\n\nexport default _createButton\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isObject from './utils/types/isObject'\nimport isArray from './utils/types/isArray'\nimport later from './utils/lang/later'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\nimport hasClass from './utils/dom/hasClass'\nimport removeClass from './utils/dom/removeClass'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport publish from './utils/observer/emit'\nimport paint from './utils/icons/paint'\n\nimport _createButton from './_createButton'\n\nconst DISABLED = 'outline-toolbar_disabled'\nconst HIDDEN = 'outline-toolbar_hidden'\n\nclass Toolbar extends Base {\n constructor(options) {\n super()\n\n this.attrs = Toolbar.DEFAULTS\n this.$el = null\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n created = this.attr('created')\n this.disabled = this.attr('disabled')\n this.closed = this.attr('closed')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n isDisabled(name) {\n const buttons = this.attr('buttons')\n let button\n\n if (name) {\n button = buttons.find((option) => option.name === name)\n\n return button?.disabled\n }\n\n return this.disabled\n }\n\n isClosed() {\n return this.closed\n }\n\n highlight(name) {\n const button = this.buttons.find((item) => item.name === name)\n const ACTIVE = 'outline-toolbar_active'\n let $button\n\n if ($button) {\n return this\n }\n\n $button = button.$el\n\n if (hasClass($button, ACTIVE)) {\n removeClass($button, ACTIVE)\n } else {\n addClass($button, ACTIVE)\n }\n\n return this\n }\n\n render() {\n const mounted = this.attr('mounted')\n const buttons = this.attr('buttons') || []\n const rounded = this.attr('rounded')\n const placement = this.attr('placement')\n const $buttons = document.createDocumentFragment()\n const $fragment = document.createDocumentFragment()\n\n paint()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $buttons.appendChild($button)\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el = createElement(\n 'div',\n {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n },\n [$buttons]\n )\n $fragment.appendChild(this.$el)\n document.body.appendChild($fragment)\n\n if (this.closed) {\n this.hide()\n }\n\n if (this.disabled) {\n this.disable()\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n add(button) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const action = button.action\n const $fragment = document.createDocumentFragment()\n let type\n\n if (isObject(button)) {\n buttons.push(button)\n $fragment.appendChild(_createButton(button))\n } else if (isArray(button)) {\n button.forEach((item) => {\n $fragment.appendChild(_createButton(item))\n })\n }\n $el.appendChild($fragment)\n\n if (action && isFunction(action.handler)) {\n type = action.type || 'click'\n on($el, `.${button.name}`, type, action.handler)\n }\n\n return this\n }\n\n remove(name) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let index = -1\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((button, i) => {\n if (button.name === name) {\n index = i\n }\n })\n\n if (index > -1) {\n this.attr().buttons.splice(index, 1)\n }\n\n $button = $el.querySelector(`.${name}`)\n this.switch(name, false)\n $el.removeChild($button)\n\n return this\n }\n\n switch(name, enabled) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let action\n let type\n let listener\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((option) => {\n if (option.name === name) {\n button.disabled = !enabled\n }\n })\n\n action = button.action\n $button = $el.querySelector(`.${name}`)\n\n if (action) {\n type = action.type || 'click'\n listener = action.handler\n }\n\n if (enabled) {\n removeClass($button, DISABLED)\n\n if (type && listener) {\n on($el, `.${name}`, type, listener)\n }\n } else {\n addClass($button, DISABLED)\n\n if (type && listener) {\n off($el, type, listener)\n }\n }\n\n return this\n }\n\n disable(name) {\n const disabled = this.attr('afterDisabled')\n\n if (name) {\n this.switch(name, false)\n } else {\n addClass(this.$el, DISABLED)\n this.removeListeners()\n this.disabled = true\n\n if (isFunction(disabled)) {\n disabled.call(this)\n }\n }\n\n return this\n }\n\n enable(name) {\n const enabled = this.attr('afterEnabled')\n\n if (name) {\n this.switch(name, true)\n } else {\n this.disabled = false\n removeClass(this.$el, DISABLED)\n this.addListeners()\n\n if (isFunction(enabled)) {\n enabled.call(this)\n }\n }\n\n return this\n }\n\n show(name) {\n const opened = this.attr('afterOpened')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n\n $button = $el.querySelector(`.${name}`)\n removeClass($button, HIDDEN)\n } else {\n removeClass($el, HIDDEN)\n this.closed = false\n\n if (isFunction(opened)) {\n later(() => {\n opened.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n hide(name) {\n const closed = this.attr('afterClosed')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n $button = $el.querySelector(`.${name}`)\n addClass($button, HIDDEN)\n } else {\n addClass($el, HIDDEN)\n this.closed = true\n\n if (isFunction(closed)) {\n later(() => {\n closed.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n toggle() {\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n let $el = this.$el\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n document.body.removeChild($el)\n $el = null\n\n this.attr(Toolbar.DEFAULTS)\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n refresh() {\n const $el = this.$el\n const buttons = this.attr('buttons') || []\n\n this.removeListeners()\n $el.innerHTML = ''\n\n buttons.forEach((button) => {\n this.$el.appendChild(_createButton(button))\n })\n\n this.addListeners()\n\n return this\n }\n\n addListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n let context\n let command\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n if (isString(listener)) {\n command = listener\n action.handler = function () {\n publish(command, button.name)\n }\n listener = action.handler\n }\n\n type = action.type || 'click'\n context = action.context\n }\n\n if (isFunction(listener)) {\n on($el, `.${button.name}`, type, listener, context || this, true)\n }\n })\n\n return this\n }\n\n removeListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n type = action.type || 'click'\n }\n\n if (isFunction(listener)) {\n off($el, type, listener)\n }\n })\n\n return this\n }\n}\n\nToolbar.DEFAULTS = {\n placement: 'ltr',\n closed: false,\n disabled: false,\n rounded: true,\n buttons: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterDisabled: null,\n afterEnabled: null,\n beforeDestroy: null,\n afterDestroy: null\n}\n\nexport default Toolbar\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n let uuid = 0\n\n return (prefix) => {\n uuid += 1\n\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n }\n})()\n\nexport default guid\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题,并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - (必须)主题名称\n * @param {Function} handler - (必须)主题的处理器函数\n * @param {Object} [context] - (可选)指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n const token = guid()\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n if (!isFunction(handler)) {\n return ''\n }\n\n /* istanbul ignore else */\n if (!_subscribers[subject]) {\n _subscribers[subject] = []\n }\n\n _subscribers[subject].push({\n topic: subject,\n callback: handler,\n context,\n token\n })\n\n return token\n}\n\nexport default on\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n if (!hasOwn(_subscribers, topic)) {\n return false\n }\n\n delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n if (!has(topic)) {\n return false\n }\n\n if (token) {\n _removeSubscriberByToken(token)\n } else {\n _removeSubscriber(topic)\n }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n const keys = Object.keys(_subscribers)\n let index = -1\n\n if (!token || keys.length < 1) {\n return false\n }\n\n keys.forEach((subject) => {\n const subscriber = _subscribers[subject]\n let topic\n\n subscriber.forEach((execution, j) => {\n if (execution.callback === token || execution.token === token) {\n topic = execution.topic\n subscriber.splice(index, j)\n }\n })\n\n /* istanbul ignore else */\n if (subscriber.length < 1) {\n _removeSubscriber(topic)\n }\n })\n}\n\nexport default _removeSubscriberByToken\n","import Base from './base'\nimport Anchors from './anchors'\nimport Drawer from './drawer'\nimport Chapters from './chapters'\nimport Toolbar from './toolbar'\n\nimport later from './utils/lang/later'\nimport isFunction from './utils/types/isFunction'\nimport isString from './utils/types/isString'\nimport isElement from './utils/types/isElement'\nimport addClass from './utils/dom/addClass'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport subscribe from './utils/observer/on'\nimport unsubscribe from './utils/observer/off'\n\nimport print from './print'\n\nclass Outline extends Base {\n constructor(options) {\n super()\n\n this.attrs = Outline.DEFAULTS\n this.anchors = null\n this.drawer = null\n this.chapters = null\n this.toolbar = null\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n this.attr(options).render().addListeners()\n return this\n }\n\n getChapters(isTreeStructured = false) {\n return this.anchors.getChapters(isTreeStructured)\n }\n\n count() {\n return this.anchors.count()\n }\n\n render() {\n const scrollElement = this.attr('scrollElement')\n const $scrollElement =\n document.querySelector(scrollElement) ||\n document.getElementById(scrollElement)\n\n this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar()\n\n if ($scrollElement) {\n this.onToolbarUpdate({\n top: $scrollElement.scrollTop,\n min: 0,\n max: $scrollElement.scrollHeight\n })\n }\n\n return this\n }\n\n _renderPrint() {\n const option = this.attr('print')\n const articleElement = this.attr('articleElement')\n let $articleElement\n\n if (!option.element) {\n return this\n }\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n addClass($articleElement, 'outline-article')\n print(option.element, option.title)\n\n return this\n }\n\n _renderAnchors() {\n const articleElement = this.attr('articleElement')\n const selector = this.attr('selector')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const chapterTextFilter = this.attr('chapterTextFilter')\n\n this.anchors = new Anchors({\n articleElement,\n stickyHeight,\n scrollElement,\n selector,\n showCode,\n anchorURL,\n afterScroll,\n chapterTextFilter\n })\n\n return this\n }\n\n _renderChapters() {\n const title = this.attr('title')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const customClass = this.attr('customClass')\n const showCode = this.attr('showCode')\n const position = this.attr('position')\n const placement = this.attr('placement')\n const afterSticky = this.attr('afterSticky')\n const afterToggle = this.attr('afterToggle')\n const afterScroll = this.attr('afterScroll')\n const count = this.count()\n let parentElement = this.attr('parentElement')\n let CHAPTERS_OPTIONS\n\n if (count < 1) {\n return this\n }\n\n CHAPTERS_OPTIONS = {\n scrollElement,\n showCode,\n position,\n title,\n stickyHeight,\n chapters: this.getChapters(),\n afterSticky,\n afterToggle,\n afterScroll\n }\n\n if (position === 'relative') {\n this.drawer = new Drawer({\n placement,\n title,\n size: 'tiny',\n hasOffset: true,\n hasPadding: false,\n customClass,\n afterClosed: () => {\n const toolbar = this.toolbar\n toolbar.toggle()\n }\n })\n parentElement = this.drawer.$main\n } else {\n CHAPTERS_OPTIONS.customClass = customClass\n }\n\n CHAPTERS_OPTIONS.parentElement = parentElement\n this.chapters = new Chapters(CHAPTERS_OPTIONS)\n\n return this\n }\n\n _renderToolbar() {\n const placement = this.attr('placement')\n const homepage = this.attr('homepage')\n const git = this.attr('git')\n const tags = this.attr('tags')\n const issues = this.attr('issues')\n const tools = this.attr('tools')\n const count = this.count()\n const UP = {\n name: 'up',\n icon: 'up',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:up'\n }\n }\n const HOME = {\n name: 'homepage',\n icon: 'homepage',\n size: 20,\n link: homepage\n }\n const GIT = {\n name: 'github',\n icon: 'github',\n size: 20,\n link: git\n }\n const TAGS = {\n name: 'tags',\n icon: 'tags',\n size: 20,\n link: tags\n }\n const ISSUES = {\n name: 'issues',\n icon: 'issues',\n size: 20,\n link: issues\n }\n const MENU = {\n name: 'menu',\n icon: 'menu',\n size: 18,\n action: {\n type: 'click',\n handler: 'toolbar:action:toggle'\n }\n }\n const DOWN = {\n name: 'down',\n icon: 'down',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:down'\n }\n }\n const buttons = []\n\n buttons.push(UP)\n if (count > 0) {\n buttons.push(MENU)\n }\n if (homepage) {\n buttons.push(HOME)\n }\n if (git) {\n buttons.push(GIT)\n }\n if (tags) {\n buttons.push(TAGS)\n }\n if (issues) {\n buttons.push(ISSUES)\n }\n if (tools?.length > 0) {\n buttons.push(...tools)\n }\n buttons.push(DOWN)\n this.buttons = [...buttons]\n\n this.toolbar = new Toolbar({\n placement,\n buttons: buttons\n })\n\n return this\n }\n\n addButton(button) {\n const toolbar = this.toolbar\n const buttons = this.buttons\n buttons.splice(-1, 0, button)\n toolbar.attr({\n buttons\n })\n toolbar.refresh()\n return this\n }\n\n removeButton(name) {\n this.toolbar.remove(name)\n return this\n }\n\n toTop() {\n const afterScroll = this.attr('afterScroll')\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const afterTop = () => {\n toolbar.hide('up')\n toolbar.show('down')\n\n if (count > 0) {\n chapters.highlight(0)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'up')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(0, afterTop)\n\n return this\n }\n\n toBottom() {\n const afterScroll = this.attr('afterScroll')\n const $scrollElement = _getScrollElement(this.attr('scrollElement'))\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const top = Math.floor(\n $scrollElement.scrollHeight - $scrollElement.clientHeight\n )\n const afterDown = () => {\n toolbar.hide('down')\n toolbar.show('up')\n\n if (count > 0) {\n chapters.highlight(count - 1)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'bottom')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(top, afterDown)\n\n return this\n }\n\n scrollTo(top, afterScroll) {\n const scrollElement = this.attr('scrollElement')\n scrollTo(scrollElement, top, afterScroll)\n return this\n }\n\n toggle() {\n const position = this.attr('position')\n const toolbar = this.toolbar\n const drawer = this.drawer\n const chapters = this.chapters\n const count = this.count()\n\n if (count < 1) {\n return this\n }\n\n if (position !== 'relative') {\n chapters.toggle()\n toolbar.highlight('menu')\n } else {\n toolbar.toggle()\n\n later(() => {\n if (chapters.isInside()) {\n chapters.toggle()\n } else {\n drawer.toggle()\n }\n })\n }\n\n return this\n }\n\n destroy() {\n let anchors = this.anchors\n let chapters = this.chapters\n let drawer = this.drawer\n let toolbar = this.toolbar\n let isOutside = false\n const count = this.count()\n\n this.removeListeners()\n\n if (count > 0) {\n isOutside = chapters.isOutside()\n\n chapters.destroy()\n chapters = null\n\n if (isOutside) {\n drawer.destroy()\n drawer = null\n }\n }\n\n toolbar.destroy()\n toolbar = null\n\n anchors.destroy()\n anchors = null\n\n this.attr(Outline.DEFAULTS)\n\n return this\n }\n\n onToggle() {\n this.toggle()\n return this\n }\n\n onScrollTop() {\n this.toTop()\n return this\n }\n\n onScrollBottom() {\n this.toBottom()\n return this\n }\n\n onToolbarUpdate({ top, min, max }) {\n const toolbar = this.toolbar\n const current = Math.ceil(top)\n\n if (current <= min) {\n toolbar.hide('up')\n toolbar.show('down')\n } else if (current >= max) {\n toolbar.hide('down')\n toolbar.show('up')\n } else if (current > min && current < max) {\n toolbar.show('up')\n toolbar.show('down')\n }\n\n return this\n }\n\n addListeners() {\n subscribe('toolbar:update', this.onToolbarUpdate, this)\n subscribe('toolbar:action:up', this.onScrollTop, this)\n subscribe('toolbar:action:toggle', this.onToggle, this)\n subscribe('toolbar:action:down', this.onScrollBottom, this)\n return this\n }\n\n removeListeners() {\n unsubscribe('toolbar:update')\n unsubscribe('toolbar:action:up')\n unsubscribe('toolbar:action:toggle')\n unsubscribe('toolbar:action:down')\n return this\n }\n}\n\nOutline.DEFAULTS = {\n articleElement: '#article',\n selector: 'h2,h3,h4,h5,h6',\n title: '目录',\n scrollElement: 'html,body',\n position: 'relative',\n parentElement: '#aside',\n placement: 'rtl',\n showCode: true,\n anchorURL: '',\n stickyHeight: 0,\n homepage: '',\n git: '',\n tags: '',\n issues: '',\n tools: [],\n print: {\n element: '',\n title: ''\n },\n customClass: '',\n afterSticky: null,\n afterToggle: null,\n afterScroll: null,\n chapterTextFilter: null\n}\n\nif (window.jQuery) {\n // 将 Outline 扩展为一个 jquery 插件\n // eslint-disable-next-line no-undef\n jQuery.extend(jQuery.fn, {\n outline: function (options) {\n // eslint-disable-next-line no-undef\n let $article = jQuery(this)\n\n return new Outline(\n // eslint-disable-next-line no-undef\n jQuery.extend({}, options, {\n articleElement: $article\n })\n )\n }\n })\n}\n\nexport default Outline\n","import isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport later from './utils/lang/later'\r\n\r\nconst print = (origins, title) => {\r\n let $origins\r\n let $article\r\n let $title\r\n let $sibling\r\n let tagName\r\n let text = title\r\n\r\n if (isString(origins)) {\r\n $origins =\r\n document.querySelector(origins) || document.getElementById(origins)\r\n } else {\r\n if (isElement(origins)) {\r\n $origins = origins\r\n }\r\n }\r\n\r\n $title = $origins.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n text = $title.innerText\r\n }\r\n\r\n $article = createElement(\r\n 'article',\r\n {\r\n className: 'outline-print'\r\n },\r\n ['']\r\n )\r\n $article.innerHTML = $origins.innerHTML\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-print__title'\r\n },\r\n [text]\r\n )\r\n\r\n $article.insertBefore($title, $article.firstChild)\r\n\r\n document.body.appendChild($article)\r\n\r\n later(() => {\r\n $sibling = $article.previousElementSibling\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-print_sibling')\r\n }\r\n $sibling = $sibling.previousElementSibling\r\n }\r\n\r\n $sibling = $article.nextElementSibling\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-print_sibling')\r\n }\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }, 350)\r\n}\r\n\r\nexport default print\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","offsetTop","el","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","stopPropagation","preventDefault","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","isArray","Array","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","exec","iconName","getSymbol","paint","$body","body","$icons","symbols","add","innerHTML","join","createElement","insertBefore","firstChild","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","className","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","isSVG","pattern","RegExp","test","icon","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","hasClass","allClass","classList","contains","removeClass","remove","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","chapterTextFilter","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","id","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","anchorURL","chapterCode","headingId","href","_updateHeading","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","publish","min","addClass","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","Chapters","$list","$placeholder","$parentElement","active","offsetWidth","$active","scrollTimer","resizeTimer","playing","Observer","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","contents","calculateStickyHeight","console","time","byId","chapter","$text","$link","$code","$li","$ul","_paintChapters","positionPlaceholder","timeEnd","sticky","onObserver","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","highlight","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","Math","window","innerHeight","show","FOLDED","HIDDEN","hide","clearTimeout","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","option","ACTIVE","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","guid","uuid","prefix","token","subject","_removeSubscriber","execution","j","_removeSubscriberByToken","Outline","anchors","drawer","toolbar","getElementById","_renderPrint","_renderAnchors","_renderChapters","_renderToolbar","onToolbarUpdate","element","origins","$origins","$article","$sibling","innerText","previousElementSibling","nextElementSibling","print","CHAPTERS_OPTIONS","homepage","git","tags","issues","tools","HOME","GIT","TAGS","ISSUES","MENU","addButton","removeButton","toTop","toBottom","floor","onToggle","onScrollTop","onScrollBottom","ceil","subscribe","unsubscribe","jQuery","extend","outline"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"outline.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/types/isElement.js","src/utils/lang/later.js","src/utils/lang/easeInQuad.js","src/utils/dom/_getScrollElement.js","src/utils/dom/scrollTo.js","src/utils/dom/offsetTop.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/event/stop.js","src/utils/observer/_subscribers.js","src/utils/observer/_hasDirectSubscribersFor.js","src/utils/observer/has.js","src/utils/observer/_hasSubscribers.js","src/utils/observer/emit.js","src/utils/types/isTypedArray.js","src/utils/types/isArray.js","src/utils/icons/symbols.js","src/utils/icons/defaults.js","src/utils/icons/getSymbols.js","src/utils/icons/getSymbol.js","src/utils/icons/paint.js","src/utils/icons/add.js","src/utils/lang/trim.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/setAttribute.js","src/utils/dom/createElement.js","src/utils/types/isSVG.js","src/utils/icons/icon.js","src/utils/icons/createElement.js","src/utils/dom/hasClass.js","src/utils/dom/removeClass.js","src/_resetHeading.js","src/utils/types/isEmpty.js","src/getChapters.js","src/utils/lang/stripTags.js","src/_getChapterParentIdByDiffer.js","src/_getChaptersWithCode.js","src/anchors.js","src/utils/lang/toTree.js","src/_updateHeading.js","src/utils/dom/addClass.js","src/utils/dom/setProperty.js","src/zIndex.js","src/drawer.js","src/utils/event/at.js","src/utils/dom/getStyle.js","src/chapters.js","src/_paintChapters.js","src/utils/dom/intersection.js","src/_createButton.js","src/toolbar.js","src/utils/lang/guid.js","src/utils/observer/on.js","src/utils/observer/_removeSubscriber.js","src/utils/observer/off.js","src/utils/observer/_removeSubscriberByToken.js","src/outline.js","src/print.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from '../types/isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n let $rootElements\n let $scrollElement\n\n if (!scrollElement) {\n $rootElements = document.querySelectorAll('html,body')\n $scrollElement =\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n ? $rootElements[0]\n : $rootElements[1]\n } else {\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n }\n\n return $scrollElement\n}\n\nexport default _getScrollElement\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n const $scrollElement = _getScrollElement(scrollElement)\n let scrollTop = $scrollElement.scrollTop\n let step = 0\n const distance = top - scrollTop\n const MAX_HEIGHT = $scrollElement.scrollHeight\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n const stop = (top) => {\n if (isFunction(afterStop)) {\n afterStop(top)\n }\n\n return false\n }\n const play = () => {\n step += 1\n\n // 向上滚动\n if (distance < 0) {\n scrollTop -= easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop <= top) {\n $scrollElement.scrollTop = top\n return stop(top)\n }\n } else {\n scrollTop += easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop >= MAX_TOP) {\n $scrollElement.scrollTop = MAX_TOP\n return stop(MAX_TOP)\n }\n }\n\n requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} data - (必须)数据对象\n * @param {Boolean} async - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg =\n `` +\n `` +\n ``\n }\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n if (isSVG(name)) {\n $svg = $icon.querySelector('svg')\n $svg.setAttribute('aria-hidden', 'true')\n $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n $svg.setAttribute('class', 'outline-icon__svg')\n $svg.setAttribute('width', '200')\n $svg.setAttribute('height', '200')\n $svg.style.cssText = cssRules\n }\n\n return $icon\n}\n\nexport default createElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import removeClass from './utils/dom/removeClass'\nimport isEmpty from './utils/types/isEmpty'\nimport trim from './utils/lang/trim'\n\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\n let $anchor\n\n $heading.innerHTML = text.replace(pattern, '')\n $heading.removeAttribute('id')\n $heading.removeAttribute('data-id')\n\n removeClass($heading, CLS_HEADING)\n\n if (!hasAnchor) {\n return false\n }\n\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\n\n if (isAtStart) {\n removeClass($heading, `${CLS_HEADING}_start`)\n }\n\n if (isEmpty(trim($heading.className))) {\n $heading.removeAttribute('class')\n }\n\n $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\n","import isString from './isString'\n/**\n * 检测数据是否为空字符串\n * ========================================================================\n * @method isEmpty\n * @param {String} str\n * @returns {boolean}\n */\nconst isEmpty = (str) => {\n return isString(str) && str === ''\n}\n\nexport default isEmpty\n","import trim from './utils/lang/trim'\nimport stripTags from './utils/lang/stripTags'\nimport isFunction from './utils/types/isFunction'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\n/**\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\n * ========================================================================\n * @method getChapters\n * @param {Array} headings\n * @param {Boolean} [showCode]\n * @param {Function} [chapterTextFilter]\n * @return {*|*[]}\n */\nconst getChapters = (headings, showCode = true, chapterTextFilter = null) => {\n let previous = 1\n let level = 0\n let text = ''\n const chapters = []\n\n headings.forEach((heading, i) => {\n const tagName = heading.tagName\n const headingLevel = tagName.replace(/h/i, '')\n let current = parseInt(headingLevel, 10)\n let pid = -1\n\n // 场景1:当前标题是前一个标题的子标题\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\n // h2 (前一个标题)\n // h3 (当前标题)\n if (current > previous) {\n level += 1\n\n // 第一层级的 pid 是 -1\n if (level === 1) {\n pid = -1\n } else {\n pid = i - 1\n }\n }\n // 场景2:当前标题和前一个标题层级相同\n // 当前标题的(标题标签)序号 = 前一个标题的序号\n // h2 (前一个标题)\n // h2 (当前标题)\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\n // h2\n // h4 (前一个标题)\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\n else if (current === previous || (current < previous && current > level)) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n pid = -1\n } else {\n pid = chapters[i - 1].pid\n }\n }\n // 场景3:当前标题比前一个标题层级高\n else if (current <= level) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n } else {\n level = level - (previous - current)\n\n if (level <= 1) {\n level = 1\n }\n }\n\n // 第一级的标题\n if (level === 1) {\n pid = -1\n } else {\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\n }\n }\n\n previous = current\n\n text = stripTags(trim(heading.innerHTML))\n\n if (isFunction(chapterTextFilter)) {\n text = chapterTextFilter(text)\n }\n\n chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text,\n tagName\n })\n })\n\n return showCode ? _getChaptersWithCode(chapters) : chapters\n}\n\nexport default getChapters\n","import isString from '../types/isString'\n\n/**\n * 过滤所有 HTML 标签\n * ========================================================================\n * @method stripTags\n * @param {string} str\n * @returns {string}\n */\nconst stripTags = (str) => {\n if (!isString(str)) {\n return ''\n }\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\n}\n\nexport default stripTags\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\n let previous = chapters[index - 1]\n let pid\n let i\n\n for (i = 0; i < differ; i += 1) {\n pid = previous.pid\n previous = chapters[pid]\n }\n\n pid = previous.pid\n\n return pid\n}\n\nexport default _getChapterParentIdByDiffer\n","import isArray from './utils/types/isArray'\n\nconst _getChaptersWithCode = (chapters) => {\n const groups = {}\n const cb = (o) => {\n return [o.pid]\n }\n\n chapters.forEach((o) => {\n const group = JSON.stringify(cb(o))\n\n groups[group] = groups[group] || []\n groups[group].push(o)\n\n o.index = groups[group].length\n if (o.pid === -1) {\n o.code = String(o.index)\n }\n })\n\n Object.keys(groups).forEach((group) => {\n groups[group].forEach((c) => {\n const subjects = groups[`[${c.id}]`]\n if (!subjects || !isArray(subjects)) {\n return false\n }\n subjects.forEach((o) => {\n o.code = c.code + '.' + o.index\n })\n })\n })\n\n return chapters\n}\n\nexport default _getChaptersWithCode\n","import Base from './base'\n\n// 在文章的标题生成 anchor 链接\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport toTree from './utils/lang/toTree'\nimport later from './utils/lang/later'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport offsetTop from './utils/dom/offsetTop'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport publish from './utils/observer/emit'\nimport paint from './utils/icons/paint'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n const showCode = this.attr('showCode') || true\n let created\n let scrollElement\n let selector\n let $articleElement\n let articleElement\n\n this.attr(options)\n articleElement = this.attr('articleElement')\n scrollElement = this.attr('scrollElement')\n selector = this.attr('selector')\n created = this.attr('created')\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n if (!$articleElement) {\n return this\n }\n\n this.$articleElement = $articleElement\n this.$scrollElement = _getScrollElement(scrollElement)\n this.$headings = [...$articleElement.querySelectorAll(selector)]\n\n if (this.$headings.length < 1) {\n return this\n }\n\n this.chapters = getChapters(\n this.$headings,\n showCode,\n this.attr('chapterTextFilter')\n )\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n getChapters(isTreeStructured = false) {\n const chapters = this.chapters\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\n }\n\n count() {\n return this.chapters.length\n }\n\n render() {\n const mounted = this.attr('mounted')\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const $headings = this.$headings\n const chapters = this.getChapters()\n\n paint()\n\n $headings.forEach(($heading, i) => {\n const chapterCode = chapters[i].code\n _updateHeading($heading, i, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n destroy() {\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n onAnchorTrigger(evt) {\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const $heading = $anchor.parentNode\n const top = offsetTop($heading) - (stickyHeight + 10)\n const $scrollElement = this.$scrollElement\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'anchor')\n }\n\n later(() => {\n publish('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.scrollTo(top, after)\n\n if (!anchorURL) {\n stop(evt)\n }\n\n return this\n }\n\n addListeners() {\n const $articleElement = this.$articleElement\n\n on(\n $articleElement,\n '.outline-heading__anchor',\n 'click',\n this.onAnchorTrigger,\n this,\n true\n )\n\n return this\n }\n\n removeListeners() {\n const $articleElement = this.$articleElement\n\n off($articleElement, 'click', this.onAnchorTrigger)\n\n return this\n }\n}\n\nAnchors.DEFAULTS = {\n scrollElement: 'html,body',\n articleElement: '#article',\n selector: 'h1,h2,h3,h4,h5,h6',\n stickyHeight: 0,\n anchorURL: '',\n hasAnchor: true,\n isAtStart: true,\n showCode: false,\n created: null,\n mounted: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n chapterTextFilter: null\n}\n\nexport default Anchors\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttribute from './utils/dom/setAttribute'\n\nimport icon from './utils/icons/icon'\n\nconst _updateHeading = ($heading, i, options) => {\n const $fragment = document.createDocumentFragment()\n const CLS_HEADING = 'outline-heading'\n const hasAnchor = options.hasAnchor || true\n const isAtStart = options.isAtStart || true\n const showCode = options.showCode || false\n const chapterCode = options.chapterCode || ''\n const anchorURL = options.anchorURL || ''\n const headingId = `heading-${i}`\n const attrs = {\n id: headingId,\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\n 'data-id': i\n }\n const keys = Object.keys(attrs)\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n keys.forEach((prop) => {\n setAttribute($heading, prop, attrs[prop])\n })\n\n if (showCode) {\n $heading.innerHTML = chapterCode + ' ' + text\n }\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = icon('hash', { iconSet: 'outline' })\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL || `#${headingId}`,\n target: anchorURL ? '_blank' : 'self',\n 'data-id': i\n },\n [$icon]\n )\n $fragment.appendChild($anchor)\n $heading.appendChild($fragment)\n}\n\nexport default _updateHeading\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\n\nlet index = 2000\n\nconst zIndex = (idx) => {\n if (idx) {\n index = idx\n } else {\n index += 1\n }\n\n setProperty('--outline-zIndex', `${index}`)\n\n return index\n}\n\nexport default zIndex\n","import Base from './base'\n\nimport later from './utils/lang/later'\nimport isFunction from './utils/types/isFunction'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport paint from './utils/icons/paint'\nimport icon from './utils/icons/icon'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = true\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n\n this.title = this.attr('title')\n created = this.attr('created')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n return this\n }\n\n setTitle(title) {\n this.attr('title', title)\n this.title = title\n this.$title.innerHTML = title\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n render() {\n const mounted = this.attr('mounted')\n const size = this.attr('size')\n const placement = this.attr('placement')\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const hasOffset = this.attr('hasOffset')\n const hasPadding = this.attr('hasPadding')\n const autoHeight = this.attr('autoHeight')\n const customClass = this.attr('customClass')\n let $el\n let $modal\n let $header\n let $title\n let $close\n let $main\n let $footer\n let $overlay\n\n paint()\n this.zIndex = zIndex()\n\n $title = createElement(\n 'h2',\n {\n className: 'outline-drawer__title'\n },\n [this.title]\n )\n this.$title = $title\n\n if (hasClose) {\n $close = createElement(\n 'div',\n {\n className: 'outline-drawer__close'\n },\n [icon('close', { size: 20 })]\n )\n this.$close = $close\n }\n\n $header = createElement(\n 'header',\n {\n className: 'outline-drawer__header'\n },\n [$title, $close]\n )\n this.$header = $header\n\n $main = createElement(\n 'div',\n {\n className: 'outline-drawer__main'\n },\n ['']\n )\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement(\n 'footer',\n {\n className: 'outline-drawer__footer'\n },\n ['']\n )\n this.$footer = $footer\n\n $modal = createElement(\n 'div',\n {\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\n },\n [$header, $main, $footer]\n )\n this.$modal = $modal\n\n if (hasOffset) {\n addClass($modal, 'outline-drawer_offset')\n }\n\n if (autoHeight) {\n addClass($modal, 'outline-drawer_auto')\n }\n\n if (customClass) {\n addClass($modal, customClass)\n }\n\n if (hasOverlay) {\n $overlay = createElement(\n 'div',\n {\n className: 'outline-drawer__overlay'\n },\n ['']\n )\n this.$overlay = $overlay\n }\n\n $el = createElement(\n 'div',\n {\n className: `outline-drawer`\n },\n [$modal, $overlay]\n )\n this.$el = $el\n document.body.appendChild($el)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n open() {\n const opened = this.attr('afterOpened')\n const $modal = this.$modal\n\n addClass(this.$el, 'outline-drawer_opened')\n removeClass($modal, 'outline-drawer_closed')\n addClass($modal, 'outline-drawer_opened')\n\n later(() => {\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n })\n\n return this\n }\n\n close() {\n const closed = this.attr('afterClosed')\n const $modal = this.$modal\n\n removeClass($modal, 'outline-drawer_opened')\n addClass($modal, 'outline-drawer_closed')\n\n later(() => {\n removeClass(this.$el, 'outline-drawer_opened')\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n })\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const closed = this.isClosed()\n\n if (closed) {\n this.open()\n } else {\n this.close()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n afterToggle.call(this, closed)\n })\n }\n\n return this\n }\n\n destroy() {\n const afterDestroy = this.attr('afterDestroy')\n const beforeDestroy = this.attr('beforeDestroy')\n let index = this.zIndex\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = false\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n\n index -= 1\n zIndex(index)\n this.zIndex = 0\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n addListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay) {\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (!hasClose && !hasOverlay) {\n return this\n }\n\n off($el, 'click', this.onClose)\n\n return this\n }\n\n onClose() {\n this.close()\n return this\n }\n}\n\nDrawer.DEFAULTS = {\n placement: 'rtl',\n title: '标题',\n size: 'regular',\n hasClose: true,\n hasOverlay: true,\n hasOffset: false,\n hasPadding: true,\n autoHeight: true,\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterToggle: null\n}\n\nexport default Drawer\n","import isFunction from '../types/isFunction'\nimport off from './off'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定事件\n * ========================================================================\n * @method at\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst at = (el, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n const listener = function (evt) {\n let overrideContext = context || el\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n\n if (!isFunction(fn)) {\n return false\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default at\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport later from './utils/lang/later'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport createElement from './utils/dom/createElement'\nimport scrollTo from './utils/dom/scrollTo'\nimport addClass from './utils/dom/addClass'\nimport intersection from './utils/dom/intersection'\nimport removeClass from './utils/dom/removeClass'\nimport offsetTop from './utils/dom/offsetTop'\nimport getStyle from './utils/dom/getStyle'\nimport setProperty from './utils/dom/setProperty'\nimport publish from './utils/observer/emit'\n\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = Chapters.DEFAULTS\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.chapters = []\n this.closed = false\n this.active = 0\n this.offsetTop = 0\n this.offsetWidth = 0\n this.$active = null\n this.scrollTimer = null\n this.resizeTimer = null\n this.playing = false\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n let parentElement\n let scrollElement\n let $parent\n\n this.attr(options)\n created = this.attr('created')\n parentElement = this.attr('parentElement')\n scrollElement = this.attr('scrollElement')\n\n if (isString(parentElement)) {\n $parent = document.querySelector(parentElement)\n } else if (isElement(parentElement)) {\n $parent = parentElement\n }\n this.$parentElement = $parent\n this.$scrollElement = _getScrollElement(scrollElement)\n\n this.chapters = this.attr('chapters')\n this.closed = this.attr('closed')\n this.active = this.attr('active')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n if (this.chapters.length < 1) {\n return this\n }\n\n this.render().addListeners()\n\n this.$active = document.querySelector(`#chapter-${this.active}`)\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n isSticky() {\n const position = this.attr('position')\n return position === 'sticky'\n }\n\n isFixed() {\n const position = this.attr('position')\n return position === 'fixed'\n }\n\n isInside() {\n return this.isFixed() || this.isSticky()\n }\n\n isOutside() {\n return !this.isInside()\n }\n\n _paintEdge() {\n const $fragment = document.createDocumentFragment()\n const STICKY = 'outline-chapters_sticky'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\n const contents = []\n let $title = null\n let $el\n let $main\n let $list\n let $placeholder\n\n if (!$parentElement) {\n return this\n }\n\n if (this.isInside() && title) {\n $title = createElement(\n 'h2',\n {\n className: 'outline-chapters__title'\n },\n [title]\n )\n this.$title = $title\n contents.push($title)\n }\n\n $list = createElement(\n 'ul',\n {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list`\n },\n ['']\n )\n this.$list = $list\n\n $placeholder = createElement(\n 'div',\n {\n className: 'outline-chapters__placeholder'\n },\n ['']\n )\n this.$placeholder = $placeholder\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n [$list, $placeholder]\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: `outline-chapters ${HIDDEN}`\n },\n contents\n )\n this.$el = $el\n\n if (this.isSticky()) {\n this.calculateStickyHeight()\n addClass($el, STICKY)\n }\n\n if (customClass) {\n addClass($el, customClass)\n }\n $fragment.appendChild($el)\n $parentElement.appendChild($fragment)\n\n return this\n }\n\n render() {\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n const chapters = this.chapters\n let $el\n let $list\n\n if (!$parentElement || chapters.length < 1) {\n return this\n }\n\n this._paintEdge()\n\n $el = this.$el\n $list = this.$list\n _paintChapters($list, chapters, showCode)\n removeClass($el, HIDDEN)\n this.positionPlaceholder(this.active)\n\n this.offsetTop = offsetTop($el)\n this.offsetWidth = $el.offsetWidth\n\n if (this.isFixed()) {\n this.sticky()\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n this.onObserver()\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\n const placeholderBorderTop = parseInt(\n getStyle($list, 'border-top-width'),\n 10\n )\n let height = $anchor.offsetHeight\n let offsetTop = 0\n let top\n\n if (mainPaddingTop) {\n offsetTop += mainPaddingTop\n }\n\n if (placeholderPaddingTop) {\n offsetTop += placeholderPaddingTop\n }\n\n if (placeholderMarginTop) {\n offsetTop += placeholderMarginTop\n }\n\n if (mainBorderTop) {\n offsetTop += mainBorderTop\n }\n\n if (placeholderBorderTop) {\n offsetTop += placeholderBorderTop\n }\n\n top = height * index\n // top:calc(${offsetTop}px + ${top}px);\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const HIGHLIGHT = 'outline-chapters_active'\n\n if (!$anchor) {\n return this\n }\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n this.$active = $anchor\n addClass(this.$active, HIGHLIGHT)\n\n this.positionPlaceholder(this.active)\n\n return this\n }\n\n sticky() {\n const afterSticky = this.attr('afterSticky')\n const FIXED = 'outline-chapters_fixed'\n const $el = this.$el\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (!this.isFixed()) {\n return this\n }\n\n isStickying = scrollTop >= top\n\n if (isStickying) {\n addClass($el, FIXED)\n } else {\n removeClass($el, FIXED)\n }\n\n if (isFunction(afterSticky)) {\n afterSticky.call(this, this.isClosed(), isStickying)\n }\n\n return this\n }\n\n calculateStickyHeight() {\n const documentElement = document.documentElement\n const height = Math.max(\n documentElement.clientHeight || 0,\n window.innerHeight || 0\n )\n setProperty('--outline-sticky-height', `${height}px`)\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n show() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const opened = this.attr('afterOpened')\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n removeClass($parent, HIDDEN)\n removeClass($el, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n removeClass($el, FOLDED)\n }, 30)\n } else {\n removeClass($el, HIDDEN)\n }\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n\n return this\n }\n\n hide() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const closed = this.attr('afterClosed')\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n addClass($parent, FOLDED)\n addClass($el, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n addClass($el, HIDDEN)\n })\n } else {\n addClass($el, HIDDEN)\n }\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n isStickying = scrollTop >= top\n afterToggle.call(this, this.isClosed(), isStickying)\n })\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.$active = null\n this.closed = false\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n this.scrollTimer = null\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n this.resizeTimer = null\n }\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\n\n this.Observer = intersection(\n ($heading) => {\n const id = $heading.getAttribute('data-id')\n\n if (this.playing) {\n return false\n }\n\n if (timer) {\n clearTimeout(timer)\n }\n\n timer = later(() => {\n this.highlight(id)\n }, 100)\n },\n {\n selector,\n context: this\n }\n )\n\n return this\n }\n\n onSelect(evt) {\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const id = $anchor.getAttribute('data-id')\n const headingId = $anchor.href.split('#')[1]\n const $heading = document.querySelector(`#${headingId}`)\n const top = offsetTop($heading) - (stickyHeight + 10)\n const min = 0\n const max = this.$scrollElement.scrollHeight\n const afterScroll = this.attr('afterScroll')\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'chapter')\n }\n\n later(() => {\n this.playing = false\n publish('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.playing = true\n if (this.isFixed()) {\n this.sticky()\n later(() => {\n this.scrollTo(top, after)\n this.highlight(id)\n }, 10)\n } else {\n this.scrollTo(top, after)\n this.highlight(id)\n }\n\n stop(evt)\n\n return this\n }\n\n onScroll() {\n const $scrollElement = this.$scrollElement\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n }\n\n this.scrollTimer = later(() => {\n const top = $scrollElement.scrollTop\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n\n if (this.isFixed()) {\n this.sticky()\n }\n\n publish('toolbar:update', {\n top,\n min,\n max\n })\n }, 100)\n\n return this\n }\n\n onResize() {\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n }\n\n this.resizeTimer = later(() => {\n this.calculateStickyHeight()\n })\n\n return this\n }\n\n addListeners() {\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\n at($element, 'scroll', this.onScroll, this, true)\n if (this.isSticky()) {\n at($element, 'resize', this.onResize, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const selector = this.attr('selector')\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n off($el, 'click', this.onSelect)\n off($element, 'scroll', this.onScroll)\n\n if (this.isSticky()) {\n at($element, 'resize', this.onResize)\n }\n\n if (this.Observer) {\n document.querySelectorAll(selector).forEach((section) => {\n this.Observer.unobserve(section)\n })\n }\n\n return this\n }\n}\n\nChapters.DEFAULTS = {\n parentElement: '',\n scrollElement: '',\n selector: '.outline-heading',\n active: 0,\n closed: false,\n showCode: true,\n position: 'relative',\n stickyHeight: 0,\n chapters: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterSticky: null\n}\n\nexport default Chapters\n","import createElement from './utils/dom/createElement'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const byId = (id) => document.querySelector(`#${id}`)\n\n chapters.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n [chapter.text]\n )\n const $link = createElement(\n 'a',\n {\n id: `chapter__anchor-${id}`,\n className: 'outline-chapters__anchor',\n href: '#' + rel,\n rel: rel,\n 'data-id': id\n },\n [$text]\n )\n let $code\n let $li\n let $ul\n let $parent\n\n if (showCode) {\n $code = createElement(\n 'span',\n {\n className: 'outline-chapters__code',\n 'data-id': id\n },\n [chapter.code]\n )\n\n $link.insertBefore($code, $link.firstChild)\n }\n\n $li = createElement(\n 'li',\n {\n id: `chapter-${id}`,\n className: 'outline-chapters__item',\n 'data-id': id\n },\n [$link]\n )\n\n if (pid === -1) {\n $list.appendChild($li)\n } else {\n $parent = byId(`chapter-${pid}`)\n $ul = byId(`subject-${pid}`)\n\n if (!$ul) {\n $ul = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n [$li]\n )\n\n $parent.appendChild($ul)\n } else {\n $ul.appendChild($li)\n }\n }\n })\n}\n\nexport default _paintChapters\n","import isFunction from '../types/isFunction'\nimport isElement from '../types/isElement'\n\n/**\n * 通用的 IntersectionObserver 观察者处理器\n * ========================================================================\n * @method intersection\n * @param {Function} fn\n * @param {Object} [props]\n * @param {Object|HTMLElement} [props.root]\n * @param {String} [props.selector]\n * @param {Object} [props.context]\n * @param {String} [props.attr]\n * @param {String} [props.rootMargin]\n */\nconst intersection = (fn, props = {}) => {\n const root = props.root || null\n const selector = props.selector || '.outline-heading'\n const context = props.context || null\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\n const options = {\n rootMargin: rootMargin\n }\n const Observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.intersectionRatio > 0) {\n if (isFunction(fn)) {\n fn.call(context || entry.target, entry.target)\n }\n }\n })\n }, options)\n const $root = isElement(root) ? root : document\n\n if (root) {\n options.root = root\n }\n\n $root.querySelectorAll(selector).forEach((section) => {\n Observer.observe(section)\n })\n\n return Observer\n}\n\nexport default intersection\n","import icon from './utils/icons/icon'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = icon(button.icon, {\n iconSet: button.iconSet || 'outline',\n color: button.color || '',\n size: button.size\n })\n const $anchor = createElement(\n 'a',\n {\n className: `outline-toolbar__anchor`,\n href: button.link\n },\n [$icon]\n )\n const $button = createElement(\n 'div',\n {\n className: `outline-toolbar__button ${button.name}`\n },\n [button.link ? $anchor : $icon]\n )\n\n addClass($icon, 'outline-toolbar__icon')\n\n if (rounded) {\n addClass($button, 'outline-toolbar_rounded')\n }\n\n if (button.disabled) {\n addClass($button, 'outline-toolbar_disabled')\n }\n\n return $button\n}\n\nexport default _createButton\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isObject from './utils/types/isObject'\nimport isArray from './utils/types/isArray'\nimport later from './utils/lang/later'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\nimport hasClass from './utils/dom/hasClass'\nimport removeClass from './utils/dom/removeClass'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport publish from './utils/observer/emit'\nimport paint from './utils/icons/paint'\n\nimport _createButton from './_createButton'\n\nconst DISABLED = 'outline-toolbar_disabled'\nconst HIDDEN = 'outline-toolbar_hidden'\n\nclass Toolbar extends Base {\n constructor(options) {\n super()\n\n this.attrs = Toolbar.DEFAULTS\n this.$el = null\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n created = this.attr('created')\n this.disabled = this.attr('disabled')\n this.closed = this.attr('closed')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n isDisabled(name) {\n const buttons = this.attr('buttons')\n let button\n\n if (name) {\n button = buttons.find((option) => option.name === name)\n\n return button?.disabled\n }\n\n return this.disabled\n }\n\n isClosed() {\n return this.closed\n }\n\n highlight(name) {\n const button = this.buttons.find((item) => item.name === name)\n const ACTIVE = 'outline-toolbar_active'\n let $button\n\n if ($button) {\n return this\n }\n\n $button = button.$el\n\n if (hasClass($button, ACTIVE)) {\n removeClass($button, ACTIVE)\n } else {\n addClass($button, ACTIVE)\n }\n\n return this\n }\n\n render() {\n const mounted = this.attr('mounted')\n const buttons = this.attr('buttons') || []\n const rounded = this.attr('rounded')\n const placement = this.attr('placement')\n const $buttons = document.createDocumentFragment()\n const $fragment = document.createDocumentFragment()\n\n paint()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $buttons.appendChild($button)\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el = createElement(\n 'div',\n {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n },\n [$buttons]\n )\n $fragment.appendChild(this.$el)\n document.body.appendChild($fragment)\n\n if (this.closed) {\n this.hide()\n }\n\n if (this.disabled) {\n this.disable()\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n add(button) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const action = button.action\n const $fragment = document.createDocumentFragment()\n let type\n\n if (isObject(button)) {\n buttons.push(button)\n $fragment.appendChild(_createButton(button))\n } else if (isArray(button)) {\n button.forEach((item) => {\n $fragment.appendChild(_createButton(item))\n })\n }\n $el.appendChild($fragment)\n\n if (action && isFunction(action.handler)) {\n type = action.type || 'click'\n on($el, `.${button.name}`, type, action.handler)\n }\n\n return this\n }\n\n remove(name) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let index = -1\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((button, i) => {\n if (button.name === name) {\n index = i\n }\n })\n\n if (index > -1) {\n this.attr().buttons.splice(index, 1)\n }\n\n $button = $el.querySelector(`.${name}`)\n this.switch(name, false)\n $el.removeChild($button)\n\n return this\n }\n\n switch(name, enabled) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let action\n let type\n let listener\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((option) => {\n if (option.name === name) {\n button.disabled = !enabled\n }\n })\n\n action = button.action\n $button = $el.querySelector(`.${name}`)\n\n if (action) {\n type = action.type || 'click'\n listener = action.handler\n }\n\n if (enabled) {\n removeClass($button, DISABLED)\n\n if (type && listener) {\n on($el, `.${name}`, type, listener)\n }\n } else {\n addClass($button, DISABLED)\n\n if (type && listener) {\n off($el, type, listener)\n }\n }\n\n return this\n }\n\n disable(name) {\n const disabled = this.attr('afterDisabled')\n\n if (name) {\n this.switch(name, false)\n } else {\n addClass(this.$el, DISABLED)\n this.removeListeners()\n this.disabled = true\n\n if (isFunction(disabled)) {\n disabled.call(this)\n }\n }\n\n return this\n }\n\n enable(name) {\n const enabled = this.attr('afterEnabled')\n\n if (name) {\n this.switch(name, true)\n } else {\n this.disabled = false\n removeClass(this.$el, DISABLED)\n this.addListeners()\n\n if (isFunction(enabled)) {\n enabled.call(this)\n }\n }\n\n return this\n }\n\n show(name) {\n const opened = this.attr('afterOpened')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n\n $button = $el.querySelector(`.${name}`)\n removeClass($button, HIDDEN)\n } else {\n removeClass($el, HIDDEN)\n this.closed = false\n\n if (isFunction(opened)) {\n later(() => {\n opened.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n hide(name) {\n const closed = this.attr('afterClosed')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n $button = $el.querySelector(`.${name}`)\n addClass($button, HIDDEN)\n } else {\n addClass($el, HIDDEN)\n this.closed = true\n\n if (isFunction(closed)) {\n later(() => {\n closed.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n toggle() {\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n let $el = this.$el\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n document.body.removeChild($el)\n $el = null\n\n this.attr(Toolbar.DEFAULTS)\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n refresh() {\n const $el = this.$el\n const buttons = this.attr('buttons') || []\n\n this.removeListeners()\n $el.innerHTML = ''\n\n buttons.forEach((button) => {\n this.$el.appendChild(_createButton(button))\n })\n\n this.addListeners()\n\n return this\n }\n\n addListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n let context\n let command\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n if (isString(listener)) {\n command = listener\n action.handler = function () {\n publish(command, button.name)\n }\n listener = action.handler\n }\n\n type = action.type || 'click'\n context = action.context\n }\n\n if (isFunction(listener)) {\n on($el, `.${button.name}`, type, listener, context || this, true)\n }\n })\n\n return this\n }\n\n removeListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n type = action.type || 'click'\n }\n\n if (isFunction(listener)) {\n off($el, type, listener)\n }\n })\n\n return this\n }\n}\n\nToolbar.DEFAULTS = {\n placement: 'ltr',\n closed: false,\n disabled: false,\n rounded: true,\n buttons: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterDisabled: null,\n afterEnabled: null,\n beforeDestroy: null,\n afterDestroy: null\n}\n\nexport default Toolbar\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n let uuid = 0\n\n return (prefix) => {\n uuid += 1\n\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n }\n})()\n\nexport default guid\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题,并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - (必须)主题名称\n * @param {Function} handler - (必须)主题的处理器函数\n * @param {Object} [context] - (可选)指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n const token = guid()\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n if (!isFunction(handler)) {\n return ''\n }\n\n /* istanbul ignore else */\n if (!_subscribers[subject]) {\n _subscribers[subject] = []\n }\n\n _subscribers[subject].push({\n topic: subject,\n callback: handler,\n context,\n token\n })\n\n return token\n}\n\nexport default on\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n if (!hasOwn(_subscribers, topic)) {\n return false\n }\n\n delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n if (!has(topic)) {\n return false\n }\n\n if (token) {\n _removeSubscriberByToken(token)\n } else {\n _removeSubscriber(topic)\n }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n const keys = Object.keys(_subscribers)\n let index = -1\n\n if (!token || keys.length < 1) {\n return false\n }\n\n keys.forEach((subject) => {\n const subscriber = _subscribers[subject]\n let topic\n\n subscriber.forEach((execution, j) => {\n if (execution.callback === token || execution.token === token) {\n topic = execution.topic\n subscriber.splice(index, j)\n }\n })\n\n /* istanbul ignore else */\n if (subscriber.length < 1) {\n _removeSubscriber(topic)\n }\n })\n}\n\nexport default _removeSubscriberByToken\n","import Base from './base'\nimport Anchors from './anchors'\nimport Drawer from './drawer'\nimport Chapters from './chapters'\nimport Toolbar from './toolbar'\n\nimport later from './utils/lang/later'\nimport isFunction from './utils/types/isFunction'\nimport isString from './utils/types/isString'\nimport isElement from './utils/types/isElement'\nimport addClass from './utils/dom/addClass'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport subscribe from './utils/observer/on'\nimport unsubscribe from './utils/observer/off'\n\nimport print from './print'\n\nclass Outline extends Base {\n constructor(options) {\n super()\n\n this.attrs = Outline.DEFAULTS\n this.anchors = null\n this.drawer = null\n this.chapters = null\n this.toolbar = null\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n this.attr(options).render().addListeners()\n return this\n }\n\n getChapters(isTreeStructured = false) {\n return this.anchors.getChapters(isTreeStructured)\n }\n\n count() {\n return this.anchors.count()\n }\n\n render() {\n const scrollElement = this.attr('scrollElement')\n const $scrollElement =\n document.querySelector(scrollElement) ||\n document.getElementById(scrollElement)\n\n this._renderPrint()._renderAnchors()._renderChapters()._renderToolbar()\n\n if ($scrollElement) {\n this.onToolbarUpdate({\n top: $scrollElement.scrollTop,\n min: 0,\n max: $scrollElement.scrollHeight\n })\n }\n\n return this\n }\n\n _renderPrint() {\n const option = this.attr('print')\n const articleElement = this.attr('articleElement')\n let $articleElement\n\n if (!option.element) {\n return this\n }\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n addClass($articleElement, 'outline-article')\n print(option.element, option.title)\n\n return this\n }\n\n _renderAnchors() {\n const articleElement = this.attr('articleElement')\n const selector = this.attr('selector')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const chapterTextFilter = this.attr('chapterTextFilter')\n\n this.anchors = new Anchors({\n articleElement,\n stickyHeight,\n scrollElement,\n selector,\n showCode,\n anchorURL,\n afterScroll,\n chapterTextFilter\n })\n\n return this\n }\n\n _renderChapters() {\n const title = this.attr('title')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const customClass = this.attr('customClass')\n const showCode = this.attr('showCode')\n const position = this.attr('position')\n const placement = this.attr('placement')\n const afterSticky = this.attr('afterSticky')\n const afterToggle = this.attr('afterToggle')\n const afterScroll = this.attr('afterScroll')\n const count = this.count()\n let parentElement = this.attr('parentElement')\n let CHAPTERS_OPTIONS\n\n if (count < 1) {\n return this\n }\n\n CHAPTERS_OPTIONS = {\n scrollElement,\n showCode,\n position,\n title,\n stickyHeight,\n chapters: this.getChapters(),\n afterSticky,\n afterToggle,\n afterScroll\n }\n\n if (position === 'relative') {\n this.drawer = new Drawer({\n placement,\n title,\n size: 'tiny',\n hasOffset: true,\n hasPadding: false,\n customClass,\n afterClosed: () => {\n const toolbar = this.toolbar\n toolbar.toggle()\n }\n })\n parentElement = this.drawer.$main\n } else {\n CHAPTERS_OPTIONS.customClass = customClass\n }\n\n CHAPTERS_OPTIONS.parentElement = parentElement\n this.chapters = new Chapters(CHAPTERS_OPTIONS)\n\n return this\n }\n\n _renderToolbar() {\n const placement = this.attr('placement')\n const homepage = this.attr('homepage')\n const git = this.attr('git')\n const tags = this.attr('tags')\n const issues = this.attr('issues')\n const tools = this.attr('tools')\n const count = this.count()\n const UP = {\n name: 'up',\n icon: 'up',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:up'\n }\n }\n const HOME = {\n name: 'homepage',\n icon: 'homepage',\n size: 20,\n link: homepage\n }\n const GIT = {\n name: 'github',\n icon: 'github',\n size: 20,\n link: git\n }\n const TAGS = {\n name: 'tags',\n icon: 'tags',\n size: 20,\n link: tags\n }\n const ISSUES = {\n name: 'issues',\n icon: 'issues',\n size: 20,\n link: issues\n }\n const MENU = {\n name: 'menu',\n icon: 'menu',\n size: 18,\n action: {\n type: 'click',\n handler: 'toolbar:action:toggle'\n }\n }\n const DOWN = {\n name: 'down',\n icon: 'down',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:down'\n }\n }\n const buttons = []\n\n buttons.push(UP)\n if (count > 0) {\n buttons.push(MENU)\n }\n if (homepage) {\n buttons.push(HOME)\n }\n if (git) {\n buttons.push(GIT)\n }\n if (tags) {\n buttons.push(TAGS)\n }\n if (issues) {\n buttons.push(ISSUES)\n }\n if (tools?.length > 0) {\n buttons.push(...tools)\n }\n buttons.push(DOWN)\n this.buttons = [...buttons]\n\n this.toolbar = new Toolbar({\n placement,\n buttons: buttons\n })\n\n return this\n }\n\n addButton(button) {\n const toolbar = this.toolbar\n const buttons = this.buttons\n buttons.splice(-1, 0, button)\n toolbar.attr({\n buttons\n })\n toolbar.refresh()\n return this\n }\n\n removeButton(name) {\n this.toolbar.remove(name)\n return this\n }\n\n toTop() {\n const afterScroll = this.attr('afterScroll')\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const afterTop = () => {\n toolbar.hide('up')\n toolbar.show('down')\n\n if (count > 0) {\n chapters.highlight(0)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'up')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(0, afterTop)\n\n return this\n }\n\n toBottom() {\n const afterScroll = this.attr('afterScroll')\n const $scrollElement = _getScrollElement(this.attr('scrollElement'))\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const top = Math.floor(\n $scrollElement.scrollHeight - $scrollElement.clientHeight\n )\n const afterDown = () => {\n toolbar.hide('down')\n toolbar.show('up')\n\n if (count > 0) {\n chapters.highlight(count - 1)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'bottom')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(top, afterDown)\n\n return this\n }\n\n scrollTo(top, afterScroll) {\n const scrollElement = this.attr('scrollElement')\n scrollTo(scrollElement, top, afterScroll)\n return this\n }\n\n toggle() {\n const position = this.attr('position')\n const toolbar = this.toolbar\n const drawer = this.drawer\n const chapters = this.chapters\n const count = this.count()\n\n if (count < 1) {\n return this\n }\n\n if (position !== 'relative') {\n chapters.toggle()\n toolbar.highlight('menu')\n } else {\n toolbar.toggle()\n\n later(() => {\n if (chapters.isInside()) {\n chapters.toggle()\n } else {\n drawer.toggle()\n }\n })\n }\n\n return this\n }\n\n destroy() {\n let anchors = this.anchors\n let chapters = this.chapters\n let drawer = this.drawer\n let toolbar = this.toolbar\n let isOutside = false\n const count = this.count()\n\n this.removeListeners()\n\n if (count > 0) {\n isOutside = chapters.isOutside()\n\n chapters.destroy()\n chapters = null\n\n if (isOutside) {\n drawer.destroy()\n drawer = null\n }\n }\n\n toolbar.destroy()\n toolbar = null\n\n anchors.destroy()\n anchors = null\n\n this.attr(Outline.DEFAULTS)\n\n return this\n }\n\n onToggle() {\n this.toggle()\n return this\n }\n\n onScrollTop() {\n this.toTop()\n return this\n }\n\n onScrollBottom() {\n this.toBottom()\n return this\n }\n\n onToolbarUpdate({ top, min, max }) {\n const toolbar = this.toolbar\n const current = Math.ceil(top)\n\n if (current <= min) {\n toolbar.hide('up')\n toolbar.show('down')\n } else if (current >= max) {\n toolbar.hide('down')\n toolbar.show('up')\n } else if (current > min && current < max) {\n toolbar.show('up')\n toolbar.show('down')\n }\n\n return this\n }\n\n addListeners() {\n subscribe('toolbar:update', this.onToolbarUpdate, this)\n subscribe('toolbar:action:up', this.onScrollTop, this)\n subscribe('toolbar:action:toggle', this.onToggle, this)\n subscribe('toolbar:action:down', this.onScrollBottom, this)\n return this\n }\n\n removeListeners() {\n unsubscribe('toolbar:update')\n unsubscribe('toolbar:action:up')\n unsubscribe('toolbar:action:toggle')\n unsubscribe('toolbar:action:down')\n return this\n }\n}\n\nOutline.DEFAULTS = {\n articleElement: '#article',\n selector: 'h2,h3,h4,h5,h6',\n title: '目录',\n scrollElement: 'html,body',\n position: 'relative',\n parentElement: '#aside',\n placement: 'rtl',\n showCode: true,\n anchorURL: '',\n stickyHeight: 0,\n homepage: '',\n git: '',\n tags: '',\n issues: '',\n tools: [],\n print: {\n element: '',\n title: ''\n },\n customClass: '',\n afterSticky: null,\n afterToggle: null,\n afterScroll: null,\n chapterTextFilter: null\n}\n\nif (window.jQuery) {\n // 将 Outline 扩展为一个 jquery 插件\n // eslint-disable-next-line no-undef\n jQuery.extend(jQuery.fn, {\n outline: function (options) {\n // eslint-disable-next-line no-undef\n let $article = jQuery(this)\n\n return new Outline(\n // eslint-disable-next-line no-undef\n jQuery.extend({}, options, {\n articleElement: $article\n })\n )\n }\n })\n}\n\nexport default Outline\n","import isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport later from './utils/lang/later'\r\n\r\nconst print = (origins, title) => {\r\n let $origins\r\n let $article\r\n let $title\r\n let $sibling\r\n let tagName\r\n let text = title\r\n\r\n if (isString(origins)) {\r\n $origins =\r\n document.querySelector(origins) || document.getElementById(origins)\r\n } else {\r\n if (isElement(origins)) {\r\n $origins = origins\r\n }\r\n }\r\n\r\n $title = $origins.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n text = $title.innerText\r\n }\r\n\r\n $article = createElement(\r\n 'article',\r\n {\r\n className: 'outline-print'\r\n },\r\n ['']\r\n )\r\n $article.innerHTML = $origins.innerHTML\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-print__title'\r\n },\r\n [text]\r\n )\r\n\r\n $article.insertBefore($title, $article.firstChild)\r\n\r\n document.body.appendChild($article)\r\n\r\n later(() => {\r\n $sibling = $article.previousElementSibling\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-print_sibling')\r\n }\r\n $sibling = $sibling.previousElementSibling\r\n }\r\n\r\n $sibling = $article.nextElementSibling\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-print_sibling')\r\n }\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }, 350)\r\n}\r\n\r\nexport default print\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","offsetTop","el","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","stopPropagation","preventDefault","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","isArray","Array","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","exec","iconName","getSymbol","paint","$body","body","$icons","symbols","add","innerHTML","join","createElement","insertBefore","firstChild","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","className","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","isSVG","pattern","RegExp","test","icon","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","hasClass","allClass","classList","contains","removeClass","remove","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","chapterTextFilter","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","id","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","anchorURL","chapterCode","headingId","href","_updateHeading","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","publish","min","addClass","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","Chapters","$list","$placeholder","$parentElement","active","offsetWidth","$active","scrollTimer","resizeTimer","playing","Observer","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","contents","calculateStickyHeight","byId","chapter","$text","$link","$code","$li","$ul","_paintChapters","positionPlaceholder","sticky","onObserver","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","highlight","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","Math","window","innerHeight","show","FOLDED","HIDDEN","hide","clearTimeout","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","option","ACTIVE","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","guid","uuid","prefix","token","subject","_removeSubscriber","execution","j","_removeSubscriberByToken","Outline","anchors","drawer","toolbar","getElementById","_renderPrint","_renderAnchors","_renderChapters","_renderToolbar","onToolbarUpdate","element","origins","$origins","$article","$sibling","innerText","previousElementSibling","nextElementSibling","print","CHAPTERS_OPTIONS","homepage","git","tags","issues","tools","HOME","GIT","TAGS","ISSUES","MENU","addButton","removeButton","toTop","toBottom","floor","onToggle","onScrollTop","onScrollBottom","ceil","subscribe","unsubscribe","jQuery","extend","outline"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 91b5955c..2014d6cc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@yaohaixiao/outline.js", - "version": "3.18.0", + "version": "3.18.1", "description": "outline.js - 自动生成文章导读(Table of Contents)导航的 JavaScript 工具。", "main": "outline.min.js", "files": [ diff --git a/src/utils/icons/createElement.js b/src/utils/icons/createElement.js index 86dc1872..f2aae432 100644 --- a/src/utils/icons/createElement.js +++ b/src/utils/icons/createElement.js @@ -53,7 +53,7 @@ const createElement = (name, options = {}) => { $svg.setAttribute('class', 'outline-icon__svg') $svg.setAttribute('width', '200') $svg.setAttribute('height', '200') - $svg.style = cssRules + $svg.style.cssText = cssRules } return $icon diff --git a/toolbar.min.js b/toolbar.min.js index b62ff205..f351e3e9 100644 --- a/toolbar.min.js +++ b/toolbar.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Toolbar=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),n=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class r{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const r=this.attrs;return t(s)?i&&e(r,s)?(r[s]=i,this):r[s]:n(s)?(o=r,l=s,Object.keys(l).forEach((t=>{e(l,t)&&(o[t]=l[t])})),this):0===arguments.length?r:this;var o,l}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const o=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),l=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),a=t=>!!(n(t)&&t.nodeName&&t.tagName&&1===t.nodeType),c=t=>{return!(!n(t)||!(a(t)||(t=>!(!n(t)||"[object NodeList]"!==s(t)))(t)||(e=t,n(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!n(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},h=(s,i,r)=>{const l=document.createDocumentFragment(),a=document.createElement(s),h=e=>c(e)||t(e),d=e=>{let s;if(!h(e))return!1;c(e)?s=e:t(e)&&(s=document.createTextNode(e)),l.appendChild(s)};return n(i)?Object.keys(i).forEach((t=>{e(i,t)&&((t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}})(a,t,i[t])})):o(i)&&i.every((t=>h(t)))&&i.forEach((t=>{d(t)})),o(r)?r.forEach((t=>{d(t)})):d(r),a.appendChild(l),a},d=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,n;return!!a(t)&&(i=t.className,!!i&&(n=t.classList,n?.contains?t.classList.contains(e):!!s.exec(i)))},u=(t,e)=>{let s,i;if(d(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},b=(e,s)=>{let i,n=e.className;if(!n||!d(e,s))return!1;var r;i=e.classList,i?.remove?i.remove(s):(r=n.replace(s,""),n=!!t(r)&&r.replace(/(^\s+)|(\s+$)/g,""),e.className=n)},m=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},f=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,p=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],y=(t,e,s)=>{const i=p.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let n=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const r=t.fn;e===t.type&&(n=i,r===s&&(n=i))})),n>-1&&i.splice(n,1)}(t,e,s),t.removeEventListener(e,s,i)},v=function(e,s,i=!1){const n=t(e)?document.querySelector(e):e,r=n.childNodes,o=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(n,s);o.forEach((t=>{y(n,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&n&&r&&r.forEach((t=>{a(t)&&v(t,s,i)}))},g=(t,e,s)=>{if(!i(s))return v(t,e);y(t,e,s)},$=(t,e,s,i,n,r,o=!1)=>{const l=p.indexOf(s)>-1,a=function(l){const c=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(l),h=((t,e,s,i)=>{const n=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===n&&m(t,e):m(t,e))||i&&t===n)return t;if(t===n)break}while(t=f(t))})(c,e,t);let d=r||t;l.delegateTarget=h,!0===r&&(d=n),h&&(!0===o&&g(t,s,a),i.call(d,l,n))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:n,context:r,capture:l}),i._delegateListener=a,t.addEventListener(s,a,l)},x={},L=t=>e(x,t)&&x[t].length>0,z=(t,e=!0)=>e?L(t):(t=>{let e=L(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=L(t);return e})(t),M=(t,e,i=!0)=>{const n=t=>{if(!L(t))return!1;x[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},r=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),n(e);n(t),n("*")};if(!z(t))return!1;i?setTimeout(r,10):r()},w=['','','','','','','','',''],E=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return w.find((n=>{const r=s.exec(n)[1];return i.exec(r)[1]===e&&r===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):[...w],j=(e="")=>{const s=document.body;let i=document.querySelector("#outline-icons"),n=[];(e=>{if(!e)return!1;o(e)&&e.length>0?e.forEach((e=>{-1===w.indexOf(e)&&t(e)&&w.push(e)})):t(e)&&w.push(e)})(e),n=E(),i?i.innerHTML=n.join(""):(i=document.createElement("div"),i.innerHTML=``,s.insertBefore(i.firstChild,s.firstChild))},A=e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)},_=(e,s={})=>((e,s={})=>{const i=s.size||0,n=s.color||"",r=s.iconSet||"",l=o(i)?i[0]:i,a=o(i)?i[1]:i,c=i?`width:${l}px;height:${a}px;`:"",h=n?c+`color:${n}`:c,d=document.createElement("i");let u,b="",m="";return t(e)?(A(e)?m=e:(b=r&&"icon"!==r?`xlink:href="#${r}-icon-${e}"`:`xlink:href="#icon-${e}"`,m=``),d.className="outline-icon",d.innerHTML=m,A(e)&&(u=d.querySelector("svg"),u.setAttribute("aria-hidden","true"),u.setAttribute("xmlns","http://www.w3.org/2000/svg"),u.setAttribute("class","outline-icon__svg"),u.setAttribute("width","200"),u.setAttribute("height","200"),u.style=h),d):null})(e,s),N=(t,e=!0)=>{const s=_(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=h("a",{className:"outline-toolbar__anchor",href:t.link},[s]),n=h("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return u(s,"outline-toolbar__icon"),e&&u(n,"outline-toolbar_rounded"),t.disabled&&u(n,"outline-toolbar_disabled"),n},T="outline-toolbar_disabled",C="outline-toolbar_hidden";class S extends r{constructor(t){super(),this.attrs=S.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,d(i,s)?b(i,s):u(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),n=this.attr("placement"),r=document.createDocumentFragment(),o=document.createDocumentFragment();return j(),e.forEach((t=>{const e=N(t,s);r.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=h("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${n}`},[r]),o.appendChild(this.$el),document.body.appendChild(o),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),r=t.action,l=document.createDocumentFragment();let a;return n(t)?(s.push(t),l.appendChild(N(t))):o(t)&&t.forEach((t=>{l.appendChild(N(t))})),e.appendChild(l),r&&i(r.handler)&&(a=r.type||"click",$(e,`.${t.name}`,a,r.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let n,r=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(r=s)})),r>-1&&this.attr().buttons.splice(r,1),n=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(n),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),n=i.find((e=>e.name===t));let r,o,l,a;return n?(i.forEach((s=>{s.name===t&&(n.disabled=!e)})),r=n.action,a=s.querySelector(`.${t}`),r&&(o=r.type||"click",l=r.handler),e?(b(a,T),o&&l&&$(s,`.${t}`,o,l)):(u(a,T),o&&l&&g(s,o,l)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(u(this.$el,T),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,b(this.$el,T),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),n=this.$el;let r;if(t){if(!s)return this;r=n.querySelector(`.${t}`),b(r,C)}else b(n,C),this.closed=!1,i(e)&&l((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),n=this.$el;let r;if(t){if(!s)return this;r=n.querySelector(`.${t}`),u(r,C)}else u(n,C),this.closed=!0,i(e)&&l((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(S.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(N(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const n=e.action;let r,o,l,a;if(this.disabled)return!1;n&&(o=n.handler,t(o)&&(a=o,n.handler=function(){M(a,e.name)},o=n.handler),r=n.type||"click",l=n.context),i(o)&&$(s,`.${e.name}`,r,o,l||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let n,r;if(this.disabled)return!1;s&&(r=s.handler,n=s.type||"click"),i(r)&&g(e,n,r)})),this}}return S.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null},S})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Toolbar=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),n=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class r{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const r=this.attrs;return t(s)?i&&e(r,s)?(r[s]=i,this):r[s]:n(s)?(o=r,l=s,Object.keys(l).forEach((t=>{e(l,t)&&(o[t]=l[t])})),this):0===arguments.length?r:this;var o,l}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const o=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),l=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),a=t=>!!(n(t)&&t.nodeName&&t.tagName&&1===t.nodeType),c=t=>{return!(!n(t)||!(a(t)||(t=>!(!n(t)||"[object NodeList]"!==s(t)))(t)||(e=t,n(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!n(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},h=(s,i,r)=>{const l=document.createDocumentFragment(),a=document.createElement(s),h=e=>c(e)||t(e),d=e=>{let s;if(!h(e))return!1;c(e)?s=e:t(e)&&(s=document.createTextNode(e)),l.appendChild(s)};return n(i)?Object.keys(i).forEach((t=>{e(i,t)&&((t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}})(a,t,i[t])})):o(i)&&i.every((t=>h(t)))&&i.forEach((t=>{d(t)})),o(r)?r.forEach((t=>{d(t)})):d(r),a.appendChild(l),a},d=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,n;return!!a(t)&&(i=t.className,!!i&&(n=t.classList,n?.contains?t.classList.contains(e):!!s.exec(i)))},u=(t,e)=>{let s,i;if(d(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},b=(e,s)=>{let i,n=e.className;if(!n||!d(e,s))return!1;var r;i=e.classList,i?.remove?i.remove(s):(r=n.replace(s,""),n=!!t(r)&&r.replace(/(^\s+)|(\s+$)/g,""),e.className=n)},m=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},f=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,p=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],y=(t,e,s)=>{const i=p.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let n=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const r=t.fn;e===t.type&&(n=i,r===s&&(n=i))})),n>-1&&i.splice(n,1)}(t,e,s),t.removeEventListener(e,s,i)},v=function(e,s,i=!1){const n=t(e)?document.querySelector(e):e,r=n.childNodes,o=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(n,s);o.forEach((t=>{y(n,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&n&&r&&r.forEach((t=>{a(t)&&v(t,s,i)}))},g=(t,e,s)=>{if(!i(s))return v(t,e);y(t,e,s)},$=(t,e,s,i,n,r,o=!1)=>{const l=p.indexOf(s)>-1,a=function(l){const c=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(l),h=((t,e,s,i)=>{const n=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===n&&m(t,e):m(t,e))||i&&t===n)return t;if(t===n)break}while(t=f(t))})(c,e,t);let d=r||t;l.delegateTarget=h,!0===r&&(d=n),h&&(!0===o&&g(t,s,a),i.call(d,l,n))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:n,context:r,capture:l}),i._delegateListener=a,t.addEventListener(s,a,l)},x={},L=t=>e(x,t)&&x[t].length>0,z=(t,e=!0)=>e?L(t):(t=>{let e=L(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=L(t);return e})(t),M=(t,e,i=!0)=>{const n=t=>{if(!L(t))return!1;x[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},r=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),n(e);n(t),n("*")};if(!z(t))return!1;i?setTimeout(r,10):r()},w=['','','','','','','','',''],E=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return w.find((n=>{const r=s.exec(n)[1];return i.exec(r)[1]===e&&r===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):[...w],j=(e="")=>{const s=document.body;let i=document.querySelector("#outline-icons"),n=[];(e=>{if(!e)return!1;o(e)&&e.length>0?e.forEach((e=>{-1===w.indexOf(e)&&t(e)&&w.push(e)})):t(e)&&w.push(e)})(e),n=E(),i?i.innerHTML=n.join(""):(i=document.createElement("div"),i.innerHTML=``,s.insertBefore(i.firstChild,s.firstChild))},A=e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)},_=(e,s={})=>((e,s={})=>{const i=s.size||0,n=s.color||"",r=s.iconSet||"",l=o(i)?i[0]:i,a=o(i)?i[1]:i,c=i?`width:${l}px;height:${a}px;`:"",h=n?c+`color:${n}`:c,d=document.createElement("i");let u,b="",m="";return t(e)?(A(e)?m=e:(b=r&&"icon"!==r?`xlink:href="#${r}-icon-${e}"`:`xlink:href="#icon-${e}"`,m=``),d.className="outline-icon",d.innerHTML=m,A(e)&&(u=d.querySelector("svg"),u.setAttribute("aria-hidden","true"),u.setAttribute("xmlns","http://www.w3.org/2000/svg"),u.setAttribute("class","outline-icon__svg"),u.setAttribute("width","200"),u.setAttribute("height","200"),u.style.cssText=h),d):null})(e,s),N=(t,e=!0)=>{const s=_(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=h("a",{className:"outline-toolbar__anchor",href:t.link},[s]),n=h("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return u(s,"outline-toolbar__icon"),e&&u(n,"outline-toolbar_rounded"),t.disabled&&u(n,"outline-toolbar_disabled"),n},T="outline-toolbar_disabled",C="outline-toolbar_hidden";class S extends r{constructor(t){super(),this.attrs=S.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,d(i,s)?b(i,s):u(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),n=this.attr("placement"),r=document.createDocumentFragment(),o=document.createDocumentFragment();return j(),e.forEach((t=>{const e=N(t,s);r.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=h("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${n}`},[r]),o.appendChild(this.$el),document.body.appendChild(o),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),r=t.action,l=document.createDocumentFragment();let a;return n(t)?(s.push(t),l.appendChild(N(t))):o(t)&&t.forEach((t=>{l.appendChild(N(t))})),e.appendChild(l),r&&i(r.handler)&&(a=r.type||"click",$(e,`.${t.name}`,a,r.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let n,r=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(r=s)})),r>-1&&this.attr().buttons.splice(r,1),n=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(n),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),n=i.find((e=>e.name===t));let r,o,l,a;return n?(i.forEach((s=>{s.name===t&&(n.disabled=!e)})),r=n.action,a=s.querySelector(`.${t}`),r&&(o=r.type||"click",l=r.handler),e?(b(a,T),o&&l&&$(s,`.${t}`,o,l)):(u(a,T),o&&l&&g(s,o,l)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(u(this.$el,T),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,b(this.$el,T),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),n=this.$el;let r;if(t){if(!s)return this;r=n.querySelector(`.${t}`),b(r,C)}else b(n,C),this.closed=!1,i(e)&&l((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),n=this.$el;let r;if(t){if(!s)return this;r=n.querySelector(`.${t}`),u(r,C)}else u(n,C),this.closed=!0,i(e)&&l((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(S.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(N(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const n=e.action;let r,o,l,a;if(this.disabled)return!1;n&&(o=n.handler,t(o)&&(a=o,n.handler=function(){M(a,e.name)},o=n.handler),r=n.type||"click",l=n.context),i(o)&&$(s,`.${e.name}`,r,o,l||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let n,r;if(this.disabled)return!1;s&&(r=s.handler,n=s.type||"click"),i(r)&&g(e,n,r)})),this}}return S.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null},S})); //# sourceMappingURL=toolbar.min.js.map diff --git a/toolbar.min.js.map b/toolbar.min.js.map index 44604075..5a39767e 100644 --- a/toolbar.min.js.map +++ b/toolbar.min.js.map @@ -1 +1 @@ -{"version":3,"file":"toolbar.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/types/isArray.js","src/utils/lang/later.js","src/utils/types/isElement.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/createElement.js","src/utils/dom/setAttribute.js","src/utils/dom/hasClass.js","src/utils/dom/addClass.js","src/utils/dom/removeClass.js","src/utils/lang/trim.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/observer/_subscribers.js","src/utils/observer/_hasDirectSubscribersFor.js","src/utils/observer/has.js","src/utils/observer/_hasSubscribers.js","src/utils/observer/emit.js","src/utils/types/isTypedArray.js","src/utils/icons/symbols.js","src/utils/icons/defaults.js","src/utils/icons/getSymbols.js","src/utils/icons/getSymbol.js","src/utils/icons/paint.js","src/utils/icons/add.js","src/utils/types/isSVG.js","src/utils/icons/icon.js","src/utils/icons/createElement.js","src/_createButton.js","src/toolbar.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from '../types/isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} data - (必须)数据对象\n * @param {Boolean} async - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg =\n `` +\n `` +\n ``\n }\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n if (isSVG(name)) {\n $svg = $icon.querySelector('svg')\n $svg.setAttribute('aria-hidden', 'true')\n $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n $svg.setAttribute('class', 'outline-icon__svg')\n $svg.setAttribute('width', '200')\n $svg.setAttribute('height', '200')\n $svg.style = cssRules\n }\n\n return $icon\n}\n\nexport default createElement\n","import icon from './utils/icons/icon'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = icon(button.icon, {\n iconSet: button.iconSet || 'outline',\n color: button.color || '',\n size: button.size\n })\n const $anchor = createElement(\n 'a',\n {\n className: `outline-toolbar__anchor`,\n href: button.link\n },\n [$icon]\n )\n const $button = createElement(\n 'div',\n {\n className: `outline-toolbar__button ${button.name}`\n },\n [button.link ? $anchor : $icon]\n )\n\n addClass($icon, 'outline-toolbar__icon')\n\n if (rounded) {\n addClass($button, 'outline-toolbar_rounded')\n }\n\n if (button.disabled) {\n addClass($button, 'outline-toolbar_disabled')\n }\n\n return $button\n}\n\nexport default _createButton\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isObject from './utils/types/isObject'\nimport isArray from './utils/types/isArray'\nimport later from './utils/lang/later'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\nimport hasClass from './utils/dom/hasClass'\nimport removeClass from './utils/dom/removeClass'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport publish from './utils/observer/emit'\nimport paint from './utils/icons/paint'\n\nimport _createButton from './_createButton'\n\nconst DISABLED = 'outline-toolbar_disabled'\nconst HIDDEN = 'outline-toolbar_hidden'\n\nclass Toolbar extends Base {\n constructor(options) {\n super()\n\n this.attrs = Toolbar.DEFAULTS\n this.$el = null\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n created = this.attr('created')\n this.disabled = this.attr('disabled')\n this.closed = this.attr('closed')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n isDisabled(name) {\n const buttons = this.attr('buttons')\n let button\n\n if (name) {\n button = buttons.find((option) => option.name === name)\n\n return button?.disabled\n }\n\n return this.disabled\n }\n\n isClosed() {\n return this.closed\n }\n\n highlight(name) {\n const button = this.buttons.find((item) => item.name === name)\n const ACTIVE = 'outline-toolbar_active'\n let $button\n\n if ($button) {\n return this\n }\n\n $button = button.$el\n\n if (hasClass($button, ACTIVE)) {\n removeClass($button, ACTIVE)\n } else {\n addClass($button, ACTIVE)\n }\n\n return this\n }\n\n render() {\n const mounted = this.attr('mounted')\n const buttons = this.attr('buttons') || []\n const rounded = this.attr('rounded')\n const placement = this.attr('placement')\n const $buttons = document.createDocumentFragment()\n const $fragment = document.createDocumentFragment()\n\n paint()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $buttons.appendChild($button)\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el = createElement(\n 'div',\n {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n },\n [$buttons]\n )\n $fragment.appendChild(this.$el)\n document.body.appendChild($fragment)\n\n if (this.closed) {\n this.hide()\n }\n\n if (this.disabled) {\n this.disable()\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n add(button) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const action = button.action\n const $fragment = document.createDocumentFragment()\n let type\n\n if (isObject(button)) {\n buttons.push(button)\n $fragment.appendChild(_createButton(button))\n } else if (isArray(button)) {\n button.forEach((item) => {\n $fragment.appendChild(_createButton(item))\n })\n }\n $el.appendChild($fragment)\n\n if (action && isFunction(action.handler)) {\n type = action.type || 'click'\n on($el, `.${button.name}`, type, action.handler)\n }\n\n return this\n }\n\n remove(name) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let index = -1\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((button, i) => {\n if (button.name === name) {\n index = i\n }\n })\n\n if (index > -1) {\n this.attr().buttons.splice(index, 1)\n }\n\n $button = $el.querySelector(`.${name}`)\n this.switch(name, false)\n $el.removeChild($button)\n\n return this\n }\n\n switch(name, enabled) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let action\n let type\n let listener\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((option) => {\n if (option.name === name) {\n button.disabled = !enabled\n }\n })\n\n action = button.action\n $button = $el.querySelector(`.${name}`)\n\n if (action) {\n type = action.type || 'click'\n listener = action.handler\n }\n\n if (enabled) {\n removeClass($button, DISABLED)\n\n if (type && listener) {\n on($el, `.${name}`, type, listener)\n }\n } else {\n addClass($button, DISABLED)\n\n if (type && listener) {\n off($el, type, listener)\n }\n }\n\n return this\n }\n\n disable(name) {\n const disabled = this.attr('afterDisabled')\n\n if (name) {\n this.switch(name, false)\n } else {\n addClass(this.$el, DISABLED)\n this.removeListeners()\n this.disabled = true\n\n if (isFunction(disabled)) {\n disabled.call(this)\n }\n }\n\n return this\n }\n\n enable(name) {\n const enabled = this.attr('afterEnabled')\n\n if (name) {\n this.switch(name, true)\n } else {\n this.disabled = false\n removeClass(this.$el, DISABLED)\n this.addListeners()\n\n if (isFunction(enabled)) {\n enabled.call(this)\n }\n }\n\n return this\n }\n\n show(name) {\n const opened = this.attr('afterOpened')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n\n $button = $el.querySelector(`.${name}`)\n removeClass($button, HIDDEN)\n } else {\n removeClass($el, HIDDEN)\n this.closed = false\n\n if (isFunction(opened)) {\n later(() => {\n opened.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n hide(name) {\n const closed = this.attr('afterClosed')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n $button = $el.querySelector(`.${name}`)\n addClass($button, HIDDEN)\n } else {\n addClass($el, HIDDEN)\n this.closed = true\n\n if (isFunction(closed)) {\n later(() => {\n closed.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n toggle() {\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n let $el = this.$el\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n document.body.removeChild($el)\n $el = null\n\n this.attr(Toolbar.DEFAULTS)\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n refresh() {\n const $el = this.$el\n const buttons = this.attr('buttons') || []\n\n this.removeListeners()\n $el.innerHTML = ''\n\n buttons.forEach((button) => {\n this.$el.appendChild(_createButton(button))\n })\n\n this.addListeners()\n\n return this\n }\n\n addListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n let context\n let command\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n if (isString(listener)) {\n command = listener\n action.handler = function () {\n publish(command, button.name)\n }\n listener = action.handler\n }\n\n type = action.type || 'click'\n context = action.context\n }\n\n if (isFunction(listener)) {\n on($el, `.${button.name}`, type, listener, context || this, true)\n }\n })\n\n return this\n }\n\n removeListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n type = action.type || 'click'\n }\n\n if (isFunction(listener)) {\n off($el, type, listener)\n }\n })\n\n return this\n }\n}\n\nToolbar.DEFAULTS = {\n placement: 'ltr',\n closed: false,\n disabled: false,\n rounded: true,\n buttons: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterDisabled: null,\n afterEnabled: null,\n beforeDestroy: null,\n afterDestroy: null\n}\n\nexport default Toolbar\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isArray","Array","later","fn","delay","setTimeout","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","toLowerCase","style","cssText","setAttribute","className","every","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","add","removeClass","remove","replace","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","filter","getListeners","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","iconName","getSymbol","paint","$body","body","$icons","symbols","innerHTML","join","insertBefore","firstChild","isSVG","test","icon","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","_createButton","button","rounded","$anchor","href","link","$button","disabled","DISABLED","HIDDEN","Toolbar","super","DEFAULTS","closed","buttons","created","isDisabled","option","isClosed","highlight","item","ACTIVE","mounted","placement","$buttons","id","hide","disable","action","switch","removeChild","enabled","enable","show","opened","toggle","beforeDestroy","afterDestroy","refresh","command","publish","afterClosed","afterOpened","afterDisabled","afterEnabled"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"toolbar.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/types/isArray.js","src/utils/lang/later.js","src/utils/types/isElement.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/createElement.js","src/utils/dom/setAttribute.js","src/utils/dom/hasClass.js","src/utils/dom/addClass.js","src/utils/dom/removeClass.js","src/utils/lang/trim.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/observer/_subscribers.js","src/utils/observer/_hasDirectSubscribersFor.js","src/utils/observer/has.js","src/utils/observer/_hasSubscribers.js","src/utils/observer/emit.js","src/utils/types/isTypedArray.js","src/utils/icons/symbols.js","src/utils/icons/defaults.js","src/utils/icons/getSymbols.js","src/utils/icons/getSymbol.js","src/utils/icons/paint.js","src/utils/icons/add.js","src/utils/types/isSVG.js","src/utils/icons/icon.js","src/utils/icons/createElement.js","src/_createButton.js","src/toolbar.js"],"sourcesContent":["/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import toString from '../lang/toString'\nimport isFunction from '../types/isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} data - (必须)数据对象\n * @param {Boolean} async - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg =\n `` +\n `` +\n ``\n }\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n if (isSVG(name)) {\n $svg = $icon.querySelector('svg')\n $svg.setAttribute('aria-hidden', 'true')\n $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n $svg.setAttribute('class', 'outline-icon__svg')\n $svg.setAttribute('width', '200')\n $svg.setAttribute('height', '200')\n $svg.style.cssText = cssRules\n }\n\n return $icon\n}\n\nexport default createElement\n","import icon from './utils/icons/icon'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = icon(button.icon, {\n iconSet: button.iconSet || 'outline',\n color: button.color || '',\n size: button.size\n })\n const $anchor = createElement(\n 'a',\n {\n className: `outline-toolbar__anchor`,\n href: button.link\n },\n [$icon]\n )\n const $button = createElement(\n 'div',\n {\n className: `outline-toolbar__button ${button.name}`\n },\n [button.link ? $anchor : $icon]\n )\n\n addClass($icon, 'outline-toolbar__icon')\n\n if (rounded) {\n addClass($button, 'outline-toolbar_rounded')\n }\n\n if (button.disabled) {\n addClass($button, 'outline-toolbar_disabled')\n }\n\n return $button\n}\n\nexport default _createButton\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isObject from './utils/types/isObject'\nimport isArray from './utils/types/isArray'\nimport later from './utils/lang/later'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\nimport hasClass from './utils/dom/hasClass'\nimport removeClass from './utils/dom/removeClass'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport publish from './utils/observer/emit'\nimport paint from './utils/icons/paint'\n\nimport _createButton from './_createButton'\n\nconst DISABLED = 'outline-toolbar_disabled'\nconst HIDDEN = 'outline-toolbar_hidden'\n\nclass Toolbar extends Base {\n constructor(options) {\n super()\n\n this.attrs = Toolbar.DEFAULTS\n this.$el = null\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n created = this.attr('created')\n this.disabled = this.attr('disabled')\n this.closed = this.attr('closed')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n isDisabled(name) {\n const buttons = this.attr('buttons')\n let button\n\n if (name) {\n button = buttons.find((option) => option.name === name)\n\n return button?.disabled\n }\n\n return this.disabled\n }\n\n isClosed() {\n return this.closed\n }\n\n highlight(name) {\n const button = this.buttons.find((item) => item.name === name)\n const ACTIVE = 'outline-toolbar_active'\n let $button\n\n if ($button) {\n return this\n }\n\n $button = button.$el\n\n if (hasClass($button, ACTIVE)) {\n removeClass($button, ACTIVE)\n } else {\n addClass($button, ACTIVE)\n }\n\n return this\n }\n\n render() {\n const mounted = this.attr('mounted')\n const buttons = this.attr('buttons') || []\n const rounded = this.attr('rounded')\n const placement = this.attr('placement')\n const $buttons = document.createDocumentFragment()\n const $fragment = document.createDocumentFragment()\n\n paint()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $buttons.appendChild($button)\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el = createElement(\n 'div',\n {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n },\n [$buttons]\n )\n $fragment.appendChild(this.$el)\n document.body.appendChild($fragment)\n\n if (this.closed) {\n this.hide()\n }\n\n if (this.disabled) {\n this.disable()\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n add(button) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const action = button.action\n const $fragment = document.createDocumentFragment()\n let type\n\n if (isObject(button)) {\n buttons.push(button)\n $fragment.appendChild(_createButton(button))\n } else if (isArray(button)) {\n button.forEach((item) => {\n $fragment.appendChild(_createButton(item))\n })\n }\n $el.appendChild($fragment)\n\n if (action && isFunction(action.handler)) {\n type = action.type || 'click'\n on($el, `.${button.name}`, type, action.handler)\n }\n\n return this\n }\n\n remove(name) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let index = -1\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((button, i) => {\n if (button.name === name) {\n index = i\n }\n })\n\n if (index > -1) {\n this.attr().buttons.splice(index, 1)\n }\n\n $button = $el.querySelector(`.${name}`)\n this.switch(name, false)\n $el.removeChild($button)\n\n return this\n }\n\n switch(name, enabled) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let action\n let type\n let listener\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((option) => {\n if (option.name === name) {\n button.disabled = !enabled\n }\n })\n\n action = button.action\n $button = $el.querySelector(`.${name}`)\n\n if (action) {\n type = action.type || 'click'\n listener = action.handler\n }\n\n if (enabled) {\n removeClass($button, DISABLED)\n\n if (type && listener) {\n on($el, `.${name}`, type, listener)\n }\n } else {\n addClass($button, DISABLED)\n\n if (type && listener) {\n off($el, type, listener)\n }\n }\n\n return this\n }\n\n disable(name) {\n const disabled = this.attr('afterDisabled')\n\n if (name) {\n this.switch(name, false)\n } else {\n addClass(this.$el, DISABLED)\n this.removeListeners()\n this.disabled = true\n\n if (isFunction(disabled)) {\n disabled.call(this)\n }\n }\n\n return this\n }\n\n enable(name) {\n const enabled = this.attr('afterEnabled')\n\n if (name) {\n this.switch(name, true)\n } else {\n this.disabled = false\n removeClass(this.$el, DISABLED)\n this.addListeners()\n\n if (isFunction(enabled)) {\n enabled.call(this)\n }\n }\n\n return this\n }\n\n show(name) {\n const opened = this.attr('afterOpened')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n\n $button = $el.querySelector(`.${name}`)\n removeClass($button, HIDDEN)\n } else {\n removeClass($el, HIDDEN)\n this.closed = false\n\n if (isFunction(opened)) {\n later(() => {\n opened.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n hide(name) {\n const closed = this.attr('afterClosed')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n $button = $el.querySelector(`.${name}`)\n addClass($button, HIDDEN)\n } else {\n addClass($el, HIDDEN)\n this.closed = true\n\n if (isFunction(closed)) {\n later(() => {\n closed.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n toggle() {\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n let $el = this.$el\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n document.body.removeChild($el)\n $el = null\n\n this.attr(Toolbar.DEFAULTS)\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n refresh() {\n const $el = this.$el\n const buttons = this.attr('buttons') || []\n\n this.removeListeners()\n $el.innerHTML = ''\n\n buttons.forEach((button) => {\n this.$el.appendChild(_createButton(button))\n })\n\n this.addListeners()\n\n return this\n }\n\n addListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n let context\n let command\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n if (isString(listener)) {\n command = listener\n action.handler = function () {\n publish(command, button.name)\n }\n listener = action.handler\n }\n\n type = action.type || 'click'\n context = action.context\n }\n\n if (isFunction(listener)) {\n on($el, `.${button.name}`, type, listener, context || this, true)\n }\n })\n\n return this\n }\n\n removeListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n type = action.type || 'click'\n }\n\n if (isFunction(listener)) {\n off($el, type, listener)\n }\n })\n\n return this\n }\n}\n\nToolbar.DEFAULTS = {\n placement: 'ltr',\n closed: false,\n disabled: false,\n rounded: true,\n buttons: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterDisabled: null,\n afterEnabled: null,\n beforeDestroy: null,\n afterDestroy: null\n}\n\nexport default Toolbar\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isArray","Array","later","fn","delay","setTimeout","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","toLowerCase","style","cssText","setAttribute","className","every","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","add","removeClass","remove","replace","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","filter","getListeners","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","iconName","getSymbol","paint","$body","body","$icons","symbols","innerHTML","join","insertBefore","firstChild","isSVG","test","icon","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","_createButton","button","rounded","$anchor","href","link","$button","disabled","DISABLED","HIDDEN","Toolbar","super","DEFAULTS","closed","buttons","created","isDisabled","option","isClosed","highlight","item","ACTIVE","mounted","placement","$buttons","id","hide","disable","action","switch","removeChild","enabled","enable","show","opened","toggle","beforeDestroy","afterDestroy","refresh","command","publish","afterClosed","afterOpened","afterDisabled","afterEnabled"],"mappings":"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"} \ No newline at end of file