diff --git a/docs/js/navigator.min.js b/docs/js/navigator.min.js index 0ab28b3..532db1e 100644 --- a/docs/js/navigator.min.js +++ b/docs/js/navigator.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).Navigator=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===e(t),s=t=>("[object Object]"===e(t)||"object"==typeof t||i(t))&&null!==t,r=t=>!!(s(t)&&t.nodeName&&t.tagName&&1===t.nodeType),n=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:300;return!!i(t)&&setTimeout((()=>{t()}),e)},l=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],o=(t,e,i)=>{const s=l.indexOf(e)>-1;i._delegateListener&&delete(i=i._delegateListener)._delegateListener,function(t,e,i){const s=t._listeners;let r=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const n=t.fn;e===t.type&&(r=s,n===i&&(r=s))})),r>-1&&s.splice(r,1)}(t,e,i),t.removeEventListener(e,i,s)},a=function(e,i){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const n=t(e)?document.querySelector(e):e,l=n.childNodes,h=((e,i)=>{let s=e._listeners||[];return t(i)&&i&&(s=s.filter((t=>t.type===i))),s})(n,i);h.forEach((t=>{o(n,t.type,t.fn)})),(s||!0===i||1===arguments.length)&&n&&l&&l.forEach((t=>{r(t)&&a(t,i,s)}))},h=(t,e,s)=>{if(!i(s))return a(t,e),!1;o(t,e,s)},c=function(t,e,s,r,n){let o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];const a=l.indexOf(e)>-1,c=function(i){let l=n||t;!0===n&&(l=r),!0===o&&h(t,e,c),s.call(l,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(e,c,a)},u=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const i=e.replace(/^>/i,"");return!!(e&&i&&t)&&(t.matches?t.matches(i):!!t.msMatchesSelector&&t.msMatchesSelector(i))},d=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,f=function(t,e,i,s,r,n){let o=arguments.length>6&&void 0!==arguments[6]&&arguments[6];const a=l.indexOf(i)>-1,c=function(l){const a=function(t){const e=t.target;return(i=e)&&3===i.nodeType?i.parentNode:i;var i}(l),f=((t,e,i,s)=>{const r=i||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||s&&t===r)return t;if(t===r)break}while(t=d(t))})(a,e,t);let m=n||t;l.delegateTarget=f,!0===n&&(m=r),f&&(!0===o&&h(t,i,c),s.call(m,l,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:i,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(i,c,a)},m=t=>Array.isArray?Array.isArray(t):"[object Array]"===e(t),p=t=>{return!(!s(t)||!(r(t)||(t=>!(!s(t)||"[object NodeList]"!==e(t)))(t)||(i=t,s(i)&&"[object DocumentFragment]"===e(i))||(t=>!(!s(t)||!("[object Text]"===e(t)||t.tagName&&3===t.nodeType)))(t)));var i},g=(t,e)=>{const i=Object.prototype.hasOwnProperty;return t&&i.call(t,e)},v=(e,i,r)=>{const n=document.createDocumentFragment(),l=document.createElement(e),o=e=>p(e)||t(e),a=e=>{let i;if(!o(e))return!1;p(e)?i=e:t(e)&&(i=document.createTextNode(e)),n.appendChild(i)};return s(i)?((t,e)=>{if(!t||!s(e))return!1;Object.keys(e).forEach((i=>{const s=e[i];g(e,i)&&((t,e,i)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=i;break;case"value":"input"===s||"textarea"===s?t.value=i:t.setAttribute(e,i);break;case"htmlFor":t.setAttribute("for",i);break;case"className":t.className=i;break;case"innerHTML":t.innerHTML=i;break;case"innerText":t.innerText=i;break;default:t.setAttribute(e,i)}})(t,i,s)}))})(l,i):m(i)&&i.every((t=>o(t)))?i.forEach((t=>{a(t)})):p(i)?a(i):t(i)&&a(document.createTextNode(i)),m(r)?r.forEach((t=>{a(t)})):a(r),l.appendChild(n),l},y=t=>t*t,b=function(){let e,i,s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s?t(s)?i=document.querySelector(s):r(s)&&(i=s):(e=document.querySelectorAll("html,body"),i=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),i},$=(t,e,s)=>{const r=b(t);let n=r.scrollTop,l=0;const o=e-n,a=r.scrollHeight,h=e-a<=0?e:a,c=t=>(i(s)&&s(t),!1),u=()=>{if(l+=1,o<0){if(n-=y(l),r.scrollTop=n,n<=e)return r.scrollTop=e,c(e)}else if(n+=y(l),r.scrollTop=n,n>=h)return r.scrollTop=h,c(h);requestAnimationFrame(u)};requestAnimationFrame(u)},T=(t,e)=>{const i=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,n;return!!r(t)&&(s=t.className,!!s&&(n=t.classList,n&&n.contains?t.classList.contains(e):!!i.exec(s)))},_=(t,e)=>{var i;let s,r;if(T(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.add?s.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},x=(e,i)=>{var s;let r,n=e.className;if(!n||!T(e,i))return!1;var l;r=e.classList,null!==(s=r)&&void 0!==s&&s.remove?r.remove(i):(l=n.replace(i,""),n=!!t(l)&&l.replace(/(^\s+)|(\s+$)/g,""),e.className=n)},E=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=E(t.offsetParent)),e},k=(t,e)=>getComputedStyle(t)[e],S=(t,e)=>{document.documentElement.style.setProperty(t,e)},C=t=>{let e={};return null===t?null:(m(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((i=>e[i]=s(t[i])?C(t[i]):t[i]))),e)},w=[];let O,N;function j(t){for(;t.timeRemaining()>0&&w.length;){const t=w.shift();if(!i(t))return!1;t()}w.length?O=requestIdleCallback(j):(O=0,i(N)&&(N(),N=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return n((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const A=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;w.push(t),i(e)&&(N=e),O||requestIdleCallback(j)},L={},I=t=>g(L,t)&&L[t].length>0,q=function(t){return!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?I(t):(t=>{let e=I(t),i=t.lastIndexOf(".");for(;!e&&-1!==i;)i=(t=t.substring(0,i)).lastIndexOf("."),e=I(t);return e})(t)},z=function(t,i){let s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const r=t=>{if(!I(t))return!1;L[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(e(i))>-1?i.toString():i;t.callback.call(t.context||t,s)}))},n=()=>{let e=t,i=t.lastIndexOf(".");for(;-1!==i;)e=e.substring(0,i),i=e.lastIndexOf("."),r(e);r(t),r("*")};if(!q(t))return!1;s?setTimeout(n,10):n()},F=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),H=t=>{if(!g(L,t))return!1;delete L[t]},D=(t,e)=>{if(!q(t))return!1;e?(t=>{const e=Object.keys(L);if(!t||e.length<1)return!1;e.forEach((e=>{const i=L[e];let s;i.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(s=e.topic,i.splice(-1,r))})),i.length<1&&H(s)}))})(e):H(t)};class P{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(e,i){const r=this.attrs;return t(e)?i&&g(r,e)?(r[e]=i,this):r[e]:s(e)?(n=r,l=e,Object.keys(l).forEach((t=>{g(l,t)&&(n[t]=l[t])})),this):0===arguments.length?r:this;var n,l}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return z(t,e),this}$on(t,e){return function(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const r=F();let n="symbol"==typeof t?t.toString():t;i(e)&&(L[n]||(L[n]=[]),L[n].push({topic:n,callback:e,context:s,token:r}))}(t,e,this),this}$off(t,e){return D(t,e),this}addListeners(){return this}removeListeners(){return this}}class M extends P{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=C(M.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(e){let s,n,l,o;return this.attr(e),s=this.attr("created"),n=this.attr("parentElement"),l=this.attr("scrollElement"),t(n)?o=document.querySelector(n):r(n)&&(o=n),this.$parentElement=o,this.$scrollElement=b(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()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),i=this.attr("animationCurrent"),s=this.attr("customClass"),r=this.$parentElement,n=[],l=[];let o,a,h,c,u=null;return r?(this.isInside()&&e&&(u=v("h2",{className:"outline-navigator__title"},e),this.$title=u,l.push(u)),h=v("ul",{className:"outline-navigator__list"}),this.$list=h,n.push(h),i&&(c=v("div",{className:"outline-navigator__placeholder"}),this.$placeholder=c,n.push(c)),a=v("div",{className:"outline-navigator__main"},n),this.$main=a,l.push(a),o=v("nav",{id:"outline-navigator",className:"outline-navigator outline-navigator_hidden"},l),this.$el=o,this.isSticky()&&(this.calculateStickyHeight(),_(o,"outline-navigator_sticky")),s&&_(o,s),t.appendChild(o),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),e=this.$parentElement,s=this.chapters,r=this.count();let l;return!e||s.length<1||(this.isInside()&&_(e,"outline-navigator-parent"),this._paintEdge(),l=this.$el,this._paint(s),n((()=>{this.highlight(this.active)}),60),this.offsetTop=E(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),S("--outline-navigator-width",`${this.offsetWidth}px`)),i(t)&&t.call(this),r<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),i=this.$el;return function(t,e){let i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const s=e.length,r=[...e],n=e=>{const s=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,l=e.code,o=e.rel,a=[],h=v("span",{className:"outline-navigator__text"},e.text);let c,u,d,f,m;i&&(u=v("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(u)),a.push(h),c=v("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+o,rel:o,"data-id":n,"data-code":l},a),d=v("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":l},c),-1===r?t.appendChild(d):(m=s(`chapter-${r}`),f=s(`subject-${r}`),f?f.appendChild(d):(f=v("ul",{id:"subject-"+r,className:"outline-navigator__subject"},d),m.appendChild(f)))}))};if(s>400)for(n(r.splice(0,400));r.length>0;){const t=r.splice(0,400);A((()=>{n(t)}))}else n(r)}(this.$list,t,e),x(i,"outline-navigator_hidden"),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return x(e,"outline-navigator_hidden"),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,i=this.$list,s=i.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=parseInt(k(e,"padding-top"),10),l=parseInt(k(e,"border-top-width"),10),o=parseInt(k(i,"padding-top"),10),a=parseInt(k(i,"margin-top"),10),h=parseInt(k(i,"border-top-width"),10);let c,u=s.offsetHeight,d=0;return r?(n&&(d+=n),o&&(d+=o),a&&(d+=a),l&&(d+=l),h&&(d+=h),c=u*t,d+c):this}positionPlaceholder(t){const e=this.$list,i=this.$placeholder,s=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=s.offsetHeight;let l=0;return r?(l=this._getPlaceholderOffset(t),i.style.cssText=`transform: translateY(${l}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),s="outline-navigator_active",l="outline-navigator_highlight";let o=null,a=0;return e?(o=e.querySelector(`#chapter__anchor-${t}`),o?(this.active=parseInt(o.getAttribute("data-id"),10),this.$active&&(x(this.$active,l),x(this.$active,s)),this.$active=o,_(this.$active,s),i?this.positionPlaceholder(this.active):_(this.$active,l),n((()=>{((t,e)=>{let i,s;return!(!r(t)||!r(e))&&(i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),s.top>=i.top&&s.right<=i.right&&s.bottom<=i.bottom&&s.left>=i.left)})(this.$active,this.$main)||(a=this._getPlaceholderOffset(this.active),$(this.$main,a))})),this):this):this}sticky(){const t=this.attr("afterSticky"),e="outline-navigator_fixed",s=this.$el,r=this.offsetTop,n=this.$scrollElement.scrollTop;let l;return this.isFixed()?(l=n>=r,l?_(s,e):x(s,e),i(t)&&t.call(this,this.isClosed(),l),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return S("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const i=this.$scrollElement;return $(i,t,e),this}show(){const t="outline-navigator_hidden",e=this.attr("afterOpened"),s=this.count(),r=this.$el,l=this.$parentElement;return this.isInside()?s>800?x(l,t):(x(l,t),n((()=>{x(l,"outline-navigator_folded")}),30)):x(r,t),this.closed=!1,i(e)&&e.call(this),this}hide(){const t="outline-navigator_hidden",e=this.attr("afterClosed"),s=this.count(),r=this.$el,l=this.$parentElement;return this.isInside()?s>800?_(l,t):(_(l,"outline-navigator_folded"),n((()=>{_(l,t)}))):_(r,t),this.closed=!0,i(e)&&e.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)&&n((()=>{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()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),i(e)&&e.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=e.root||null,n=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),h=r(s)?s:document;return s&&(o.root=s),h.querySelectorAll(n).forEach((t=>{a.observe(t)})),a}((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=n((()=>{this.highlight(e)}),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],o=document.querySelector(`#${l}`),a=E(o)-(e+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),n((()=>{this.playing=!1,this.$emit("toolbar:update",{top:a,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),n((()=>{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=n((()=>{const e=t.scrollTop,i=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:i})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=n((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,i=e.tagName.toLowerCase();let s=e;return this.count()<1||("html"!==i&&"body"!==i||(s=window),f(t,".outline-navigator__anchor","click",this.onSelect,this,!0),c(s,"scroll",this.onScroll,this,!0),this.isSticky()&&c(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,i=this.$scrollElement,s=i.tagName.toLowerCase();let r=i;return this.count()<1||("html"!==s&&"body"!==s||(r=window),h(e,"click",this.onSelect),h(r,"scroll",this.onScroll),this.isSticky()&&h(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}return M.DEFAULTS=C({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null}),M})); +!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).Navigator=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===e(t),s=t=>("[object Object]"===e(t)||"object"==typeof t||i(t))&&null!==t,r=t=>!!(s(t)&&t.nodeName&&t.tagName&&1===t.nodeType),n=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:300;return!!i(t)&&setTimeout((()=>{t()}),e)},l=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],o=(t,e,i)=>{const s=l.indexOf(e)>-1;i._delegateListener&&delete(i=i._delegateListener)._delegateListener,function(t,e,i){const s=t._listeners;let r=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const n=t.fn;e===t.type&&(r=s,n===i&&(r=s))})),r>-1&&s.splice(r,1)}(t,e,i),t.removeEventListener(e,i,s)},a=function(e,i){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const n=t(e)?document.querySelector(e):e,l=n.childNodes,h=((e,i)=>{let s=e._listeners||[];return t(i)&&i&&(s=s.filter((t=>t.type===i))),s})(n,i);h.forEach((t=>{o(n,t.type,t.fn)})),(s||!0===i||1===arguments.length)&&n&&l&&l.forEach((t=>{r(t)&&a(t,i,s)}))},h=(t,e,s)=>{if(!i(s))return a(t,e),!1;o(t,e,s)},c=function(t,e,s,r,n){let o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];const a=l.indexOf(e)>-1,c=function(i){let l=n||t;!0===n&&(l=r),!0===o&&h(t,e,c),s.call(l,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(e,c,a)},u=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const i=e.replace(/^>/i,"");return!!(e&&i&&t)&&(t.matches?t.matches(i):!!t.msMatchesSelector&&t.msMatchesSelector(i))},d=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,f=function(t,e,i,s,r,n){let o=arguments.length>6&&void 0!==arguments[6]&&arguments[6];const a=l.indexOf(i)>-1,c=function(l){const a=function(t){const e=t.target;return(i=e)&&3===i.nodeType?i.parentNode:i;var i}(l),f=((t,e,i,s)=>{const r=i||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||s&&t===r)return t;if(t===r)break}while(t=d(t))})(a,e,t);let m=n||t;l.delegateTarget=f,!0===n&&(m=r),f&&(!0===o&&h(t,i,c),s.call(m,l,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:i,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(i,c,a)},m=t=>Array.isArray?Array.isArray(t):"[object Array]"===e(t),p=t=>{return!(!s(t)||!(r(t)||(t=>!(!s(t)||"[object NodeList]"!==e(t)))(t)||(i=t,s(i)&&"[object DocumentFragment]"===e(i))||(t=>!(!s(t)||!("[object Text]"===e(t)||t.tagName&&3===t.nodeType)))(t)));var i},g=(t,e)=>{const i=Object.prototype.hasOwnProperty;return t&&i.call(t,e)},v=(e,i,r)=>{const n=document.createDocumentFragment(),l=document.createElement(e),o=e=>p(e)||t(e),a=e=>{let i;if(!o(e))return!1;p(e)?i=e:t(e)&&(i=document.createTextNode(e)),n.appendChild(i)};return s(i)?((t,e)=>{if(!t||!s(e))return!1;Object.keys(e).forEach((i=>{const s=e[i];g(e,i)&&((t,e,i)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=i;break;case"value":"input"===s||"textarea"===s?t.value=i:t.setAttribute(e,i);break;case"htmlFor":t.setAttribute("for",i);break;case"className":t.className=i;break;case"innerHTML":t.innerHTML=i;break;case"innerText":t.innerText=i;break;default:t.setAttribute(e,i)}})(t,i,s)}))})(l,i):m(i)&&i.every((t=>o(t)))?i.forEach((t=>{a(t)})):p(i)?a(i):t(i)&&a(document.createTextNode(i)),m(r)?r.forEach((t=>{a(t)})):a(r),l.appendChild(n),l},y=t=>t*t,b=function(){let e,i,s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s?t(s)?i=document.querySelector(s):r(s)&&(i=s):(e=document.querySelectorAll("html,body"),i=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),i},$=(t,e,s)=>{const r=b(t);let n=r.scrollTop,l=0;const o=e-n,a=r.scrollHeight,h=e-a<=0?e:a,c=t=>(i(s)&&s(t),!1),u=()=>{if(l+=1,o<0){if(n-=y(l),r.scrollTop=n,n<=e)return r.scrollTop=e,c(e)}else if(n+=y(l),r.scrollTop=n,n>=h)return r.scrollTop=h,c(h);requestAnimationFrame(u)};requestAnimationFrame(u)},T=(t,e)=>{const i=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,n;return!!r(t)&&(s=t.className,!!s&&(n=t.classList,n&&n.contains?t.classList.contains(e):!!i.exec(s)))},_=(t,e)=>{var i;let s,r;if(T(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.add?s.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},x=(e,i)=>{var s;let r,n=e.className;if(!n||!T(e,i))return!1;var l;r=e.classList,null!==(s=r)&&void 0!==s&&s.remove?r.remove(i):(l=n.replace(i,""),n=!!t(l)&&l.replace(/(^\s+)|(\s+$)/g,""),e.className=n)},E=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=E(t.offsetParent)),e},k=(t,e)=>getComputedStyle(t)[e],S=(t,e)=>{document.documentElement.style.setProperty(t,e)},O=t=>{let e={};return null===t?null:(m(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((i=>e[i]=s(t[i])?O(t[i]):t[i]))),e)},w=[];let C,N;function j(t){for(;t.timeRemaining()>0&&w.length;){const t=w.shift();if(!i(t))return!1;t()}w.length?C=requestIdleCallback(j):(C=0,i(N)&&(N(),N=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return n((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const A=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;w.push(t),i(e)&&(N=e),C||requestIdleCallback(j)},L=(t,e)=>{let i,s;return!(!r(t)||!r(e))&&(i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),s.top>=i.top&&s.right<=i.right&&s.bottom<=i.bottom&&s.left>=i.left)},I={},q=t=>g(I,t)&&I[t].length>0,z=function(t){return!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?q(t):(t=>{let e=q(t),i=t.lastIndexOf(".");for(;!e&&-1!==i;)i=(t=t.substring(0,i)).lastIndexOf("."),e=q(t);return e})(t)},F=function(t,i){let s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const r=t=>{if(!q(t))return!1;I[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(e(i))>-1?i.toString():i;t.callback.call(t.context||t,s)}))},n=()=>{let e=t,i=t.lastIndexOf(".");for(;-1!==i;)e=e.substring(0,i),i=e.lastIndexOf("."),r(e);r(t),r("*")};if(!z(t))return!1;s?setTimeout(n,10):n()},H=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),D=t=>{if(!g(I,t))return!1;delete I[t]},P=(t,e)=>{if(!z(t))return!1;e?(t=>{const e=Object.keys(I);if(!t||e.length<1)return!1;e.forEach((e=>{const i=I[e];let s;i.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(s=e.topic,i.splice(-1,r))})),i.length<1&&D(s)}))})(e):D(t)};class M{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(e,i){const r=this.attrs;return t(e)?i&&g(r,e)?(r[e]=i,this):r[e]:s(e)?(n=r,l=e,Object.keys(l).forEach((t=>{g(l,t)&&(n[t]=l[t])})),this):0===arguments.length?r:this;var n,l}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return F(t,e),this}$on(t,e){return function(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const r=H();let n="symbol"==typeof t?t.toString():t;i(e)&&(I[n]||(I[n]=[]),I[n].push({topic:n,callback:e,context:s,token:r}))}(t,e,this),this}$off(t,e){return P(t,e),this}addListeners(){return this}removeListeners(){return this}}class R extends M{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=O(R.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(e){let s,n,l,o;return this.attr(e),s=this.attr("created"),n=this.attr("parentElement"),l=this.attr("scrollElement"),t(n)?o=document.querySelector(n):r(n)&&(o=n),this.$parentElement=o,this.$scrollElement=b(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()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),i=this.attr("animationCurrent"),s=this.attr("customClass"),r=this.$parentElement,n=[],l=[];let o,a,h,c,u=null;return r?(this.isInside()&&e&&(u=v("h2",{className:"outline-navigator__title"},e),this.$title=u,l.push(u)),h=v("ul",{className:"outline-navigator__list"}),this.$list=h,n.push(h),i&&(c=v("div",{className:"outline-navigator__placeholder"}),this.$placeholder=c,n.push(c)),a=v("div",{className:"outline-navigator__main"},n),this.$main=a,l.push(a),o=v("nav",{id:"outline-navigator",className:"outline-navigator outline-navigator_hidden"},l),this.$el=o,this.isSticky()&&(this.calculateStickyHeight(),_(o,"outline-navigator_sticky")),s&&_(o,s),t.appendChild(o),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),e=this.$parentElement,s=this.chapters,r=this.count();let l;return!e||s.length<1||(this.isInside()&&_(e,"outline-navigator-parent"),this._paintEdge(),l=this.$el,this._paint(s),n((()=>{this.highlight(this.active)}),60),this.offsetTop=E(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),S("--outline-navigator-width",`${this.offsetWidth}px`)),i(t)&&t.call(this),r<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),i=this.$el;return function(t,e){let i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const s=e.length,r=[...e],n=e=>{const s=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,l=e.code,o=e.rel,a=[],h=v("span",{className:"outline-navigator__text"},e.text);let c,u,d,f,m;i&&(u=v("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(u)),a.push(h),c=v("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+o,rel:o,"data-id":n,"data-code":l},a),d=v("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":l},c),-1===r?t.appendChild(d):(m=s(`chapter-${r}`),f=s(`subject-${r}`),f?f.appendChild(d):(f=v("ul",{id:"subject-"+r,className:"outline-navigator__subject"},d),m.appendChild(f)))}))};if(s>400)for(n(r.splice(0,400));r.length>0;){const t=r.splice(0,400);A((()=>{n(t)}))}else n(r)}(this.$list,t,e),x(i,"outline-navigator_hidden"),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return x(e,"outline-navigator_hidden"),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,i=this.$list,s=i.querySelector(".outline-navigator__anchor"),r=parseInt(k(e,"padding-top"),10),n=parseInt(k(e,"border-top-width"),10),l=parseInt(k(i,"padding-top"),10),o=parseInt(k(i,"margin-top"),10),a=parseInt(k(i,"border-top-width"),10);let h,c=0;return r&&(c+=r),l&&(c+=l),o&&(c+=o),n&&(c+=n),a&&(c+=a),h=s.offsetHeight*t,c+h}positionPlaceholder(t){const e=this.$list,i=this.$placeholder,s=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=s.offsetHeight;let l=0;return r?(l=this._getPlaceholderOffset(t),i.style.cssText=`transform: translateY(${l}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),s="outline-navigator_active",r="outline-navigator_highlight";let l=null,o=0;return e?(l=e.querySelector(`#chapter__anchor-${t}`),l?(this.active=parseInt(l.getAttribute("data-id"),10),this.$active&&(x(this.$active,r),x(this.$active,s)),this.$active=l,_(this.$active,s),i?this.positionPlaceholder(this.active):_(this.$active,r),n((()=>{console.log(!L(this.$active,this.$main)),L(this.$active,this.$main)||(o=this._getPlaceholderOffset(this.active),console.log("placeholderOffsetTop",o),$(this.$main,o))})),this):this):this}sticky(){const t=this.attr("afterSticky"),e="outline-navigator_fixed",s=this.$el,r=this.offsetTop,n=this.$scrollElement.scrollTop;let l;return this.isFixed()?(l=n>=r,l?_(s,e):x(s,e),i(t)&&t.call(this,this.isClosed(),l),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return S("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const i=this.$scrollElement;return $(i,t,e),this}show(){const t="outline-navigator_hidden",e=this.attr("afterOpened"),s=this.count(),r=this.$el,l=this.$parentElement;return this.isInside()?s>800?x(l,t):(x(l,t),n((()=>{x(l,"outline-navigator_folded")}),30)):x(r,t),this.closed=!1,i(e)&&e.call(this),this}hide(){const t="outline-navigator_hidden",e=this.attr("afterClosed"),s=this.count(),r=this.$el,l=this.$parentElement;return this.isInside()?s>800?_(l,t):(_(l,"outline-navigator_folded"),n((()=>{_(l,t)}))):_(r,t),this.closed=!0,i(e)&&e.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)&&n((()=>{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()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),i(e)&&e.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=e.root||null,n=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),h=r(s)?s:document;return s&&(o.root=s),h.querySelectorAll(n).forEach((t=>{a.observe(t)})),a}((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=n((()=>{this.highlight(e)}),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],o=document.querySelector(`#${l}`),a=E(o)-(e+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),n((()=>{this.playing=!1,this.$emit("toolbar:update",{top:a,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),n((()=>{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=n((()=>{const e=t.scrollTop,i=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:i})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=n((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,i=e.tagName.toLowerCase();let s=e;return this.count()<1||("html"!==i&&"body"!==i||(s=window),f(t,".outline-navigator__anchor","click",this.onSelect,this,!0),c(s,"scroll",this.onScroll,this,!0),this.isSticky()&&c(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,i=this.$scrollElement,s=i.tagName.toLowerCase();let r=i;return this.count()<1||("html"!==s&&"body"!==s||(r=window),h(e,"click",this.onSelect),h(r,"scroll",this.onScroll),this.isSticky()&&h(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}return R.DEFAULTS=O({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null}),R})); //# sourceMappingURL=navigator.min.js.map diff --git a/docs/js/navigator.min.js.map b/docs/js/navigator.min.js.map index ebcd531..10acff0 100644 --- a/docs/js/navigator.min.js.map +++ b/docs/js/navigator.min.js.map @@ -1 +1 @@ -{"version":3,"file":"navigator.min.js","sources":["../../utils/types/isString.js","../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/types/isObject.js","../../utils/types/isElement.js","../../utils/lang/later.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/at.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/types/isArray.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/lang/hasOwn.js","../../utils/dom/createElement.js","../../utils/dom/setAttributes.js","../../utils/dom/setAttribute.js","../../utils/lang/easeInQuad.js","../../utils/dom/_getScrollElement.js","../../utils/dom/scrollTo.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/dom/removeClass.js","../../utils/lang/trim.js","../../utils/dom/offsetTop.js","../../utils/dom/getStyle.js","../../utils/dom/setProperty.js","../../utils/lang/cloneDeep.js","../../utils/lang/timeSlice.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/lang/extend.js","../../utils/observer/on.js","../../navigator.js","../../_paintChapters.js","../../utils/dom/inBounding.js","../../utils/dom/intersection.js","../../utils/event/stop.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\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'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\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","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\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","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\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\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\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 refresh() {\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 let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\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'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport _paintChapters from './_paintChapters'\r\nimport inBounding from './utils/dom/inBounding'\r\n\r\nimport Base from './base'\r\n\r\nclass Navigator extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n if (!inBounding(this.$active, this.$main)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n scrollTo(this.$main, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from './utils/dom/createElement'\r\nimport timeSlice from './utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return false\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n return (\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n}\r\n\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isElement","nodeName","tagName","nodeType","later","fn","delay","arguments","length","undefined","setTimeout","CAPTURE_EVENTS","_off","el","type","capture","indexOf","_delegateListener","listeners","_listeners","index","forEach","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","document","querySelector","$children","childNodes","getListeners","filter","$child","off","at","data","context","once","evt","overrideContext","call","push","addEventListener","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","hasOwn","obj","prop","hasOwnProperty","createElement","attrs","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","setAttributes","keys","attr","value","setAttribute","toLowerCase","style","cssText","className","innerHTML","innerText","every","easeInQuad","x","_getScrollElement","$rootElements","$scrollElement","scrollElement","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","removeClass","remove","offsetTop","offsetParent","getStyle","ruleName","getComputedStyle","setProperty","documentElement","cloneDeep","clone","from","assign","key","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","_subscribers","_hasDirectSubscribersFor","topic","has","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","Navigator","super","_default","scrollTimer","resizeTimer","observerTimer","Observer","DEFAULTS","$title","$main","$list","$placeholder","$parentElement","$active","chapters","active","offsetWidth","playing","closed","created","parentElement","$parent","isClosed","isSticky","isFixed","isInside","isOutside","count","_paintEdge","title","animationCurrent","customClass","contents","calculateStickyHeight","mounted","_paint","highlight","sticky","onObserver","erase","showCode","clones","paint","parts","byId","chapter","pid","code","rel","$text","text","$link","$code","$li","$subject","$chapter","href","_paintChapters","_remove","removeChild","_getPlaceholderOffset","$anchor","mainPaddingTop","parseInt","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","height","offsetHeight","positionPlaceholder","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","clientHeight","innerHeight","after","show","HIDDEN","opened","hide","toggle","afterToggle","beforeDestroy","afterDestroy","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","$heading","onSelect","stickyHeight","headingId","split","afterScroll","min","stopPropagation","preventDefault","onScroll","onResize","unobserve","afterClosed","afterOpened"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"navigator.min.js","sources":["../../utils/types/isString.js","../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/types/isObject.js","../../utils/types/isElement.js","../../utils/lang/later.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/at.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/types/isArray.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/lang/hasOwn.js","../../utils/dom/createElement.js","../../utils/dom/setAttributes.js","../../utils/dom/setAttribute.js","../../utils/lang/easeInQuad.js","../../utils/dom/_getScrollElement.js","../../utils/dom/scrollTo.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/dom/removeClass.js","../../utils/lang/trim.js","../../utils/dom/offsetTop.js","../../utils/dom/getStyle.js","../../utils/dom/setProperty.js","../../utils/lang/cloneDeep.js","../../utils/lang/timeSlice.js","../../utils/dom/inBounding.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/lang/extend.js","../../utils/observer/on.js","../../navigator.js","../../_paintChapters.js","../../utils/dom/intersection.js","../../utils/event/stop.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\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'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\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","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\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","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return false\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n return (\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n}\r\n\r\nexport default inBounding\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\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\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\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 refresh() {\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 let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\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'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport _paintChapters from './_paintChapters'\r\nimport inBounding from './utils/dom/inBounding'\r\n\r\nimport Base from './base'\r\n\r\nclass Navigator extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n console.log(!inBounding(this.$active, this.$main))\r\n if (!inBounding(this.$active, this.$main)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n console.log('placeholderOffsetTop', placeholderOffsetTop)\r\n scrollTo(this.$main, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from './utils/dom/createElement'\r\nimport timeSlice from './utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n * \r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isElement","nodeName","tagName","nodeType","later","fn","delay","arguments","length","undefined","setTimeout","CAPTURE_EVENTS","_off","el","type","capture","indexOf","_delegateListener","listeners","_listeners","index","forEach","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","document","querySelector","$children","childNodes","getListeners","filter","$child","off","at","data","context","once","evt","overrideContext","call","push","addEventListener","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","hasOwn","obj","prop","hasOwnProperty","createElement","attrs","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","setAttributes","keys","attr","value","setAttribute","toLowerCase","style","cssText","className","innerHTML","innerText","every","easeInQuad","x","_getScrollElement","$rootElements","$scrollElement","scrollElement","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","removeClass","remove","offsetTop","offsetParent","getStyle","ruleName","getComputedStyle","setProperty","documentElement","cloneDeep","clone","from","assign","key","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","inBounding","parent","parentRect","childRect","getBoundingClientRect","right","bottom","left","_subscribers","_hasDirectSubscribersFor","topic","has","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","Navigator","super","_default","scrollTimer","resizeTimer","observerTimer","Observer","DEFAULTS","$title","$main","$list","$placeholder","$parentElement","$active","chapters","active","offsetWidth","playing","closed","created","parentElement","$parent","isClosed","isSticky","isFixed","isInside","isOutside","count","_paintEdge","title","animationCurrent","customClass","contents","calculateStickyHeight","mounted","_paint","highlight","sticky","onObserver","erase","showCode","clones","paint","parts","byId","chapter","pid","code","rel","$text","text","$link","$code","$li","$subject","$chapter","href","_paintChapters","_remove","removeChild","_getPlaceholderOffset","$anchor","mainPaddingTop","parseInt","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","height","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","console","log","afterSticky","FIXED","isStickying","clientHeight","innerHeight","after","show","HIDDEN","opened","hide","toggle","afterToggle","beforeDestroy","afterDestroy","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","$heading","onSelect","stickyHeight","headingId","split","afterScroll","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 5e7bb36..2d56cfa 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=>Object.prototype.toString.apply(t),e=e=>"function"==typeof e||"[object Function]"===t(e),s=function(t){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:300;return!!e(t)&&setTimeout((()=>{t()}),s)},i=s=>("[object Object]"===t(s)||"object"==typeof s||e(s))&&null!==s,r=e=>Array.isArray?Array.isArray(e):"[object Array]"===t(e),n=t=>{let e={};return null===t?null:(r(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=i(t[s])?n(t[s]):t[s]))),e)},l=t=>"string"==typeof t,o=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),a=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!o(t)&&(i=t.className,!!i&&(r=t.classList,r&&r.contains?t.classList.contains(e):!!s.exec(i)))},h=(t,e)=>{var s;let i,r;if(a(t,e))return!1;i=t.classList,null!==(s=i)&&void 0!==s&&s.add?i.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},c=t=>t*t,d=function(){let t,e,s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s?l(s)?e=document.querySelector(s):o(s)&&(e=s):(t=document.querySelectorAll("html,body"),e=t[0].scrollTop-t[1].scrollTop>=0?t[0]:t[1]),e},u=(t,s,i)=>{const r=d(t);let n=r.scrollTop,l=0;const o=s-n,a=r.scrollHeight,h=s-a<=0?s:a,u=t=>(e(i)&&i(t),!1),m=()=>{if(l+=1,o<0){if(n-=c(l),r.scrollTop=n,n<=s)return r.scrollTop=s,u(s)}else if(n+=c(l),r.scrollTop=n,n>=h)return r.scrollTop=h,u(h);requestAnimationFrame(m)};requestAnimationFrame(m)},m=t=>!!l(t)&&t.replace(/(^\s+)|(\s+$)/g,""),p=function(t){let s=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=1,o=0,a="";const h=[];return t.forEach(((t,s)=>{const r=t.tagName,c=r.replace(/h/i,"");let d=parseInt(c,10),u=-1;var p;d>n?(o+=1,u=1===o?-1:s-1):d===n||d