diff --git a/docs/getting-started.md b/docs/getting-started.md
index 9329d1db7..9f1293428 100644
--- a/docs/getting-started.md
+++ b/docs/getting-started.md
@@ -258,7 +258,19 @@ theme:
The following language codes are supported:
-
+
+
af / Afrikaans
ar / Arabic
ca / Catalan
diff --git a/docs/plugins/search.md b/docs/plugins/search.md
index 69b0cc10d..fa5733f0c 100644
--- a/docs/plugins/search.md
+++ b/docs/plugins/search.md
@@ -1,6 +1,6 @@
# Search
-The built-in [search][1] plugin provides client-side search inside the browser
+The [built-in search plugin][1] provides client-side search inside the browser
and is implemented using [lunr.js][2] which includes stemmers for the English
language by default, while stemmers for other languages are included with
[lunr-languages][3], both of which are integrated with this theme.
@@ -41,7 +41,19 @@ plugins:
The following language codes are supported:
-
+
+
ar / Arabic
da / Danish
du / Dutch
diff --git a/material/assets/javascripts/bundle.bdb82690.min.js b/material/assets/javascripts/bundle.546b0e0d.min.js
similarity index 99%
rename from material/assets/javascripts/bundle.bdb82690.min.js
rename to material/assets/javascripts/bundle.546b0e0d.min.js
index bdca3d77e..7aa77fa71 100644
--- a/material/assets/javascripts/bundle.bdb82690.min.js
+++ b/material/assets/javascripts/bundle.546b0e0d.min.js
@@ -1,2 +1,2 @@
!function(t,e){for(var n in e)t[n]=e[n]}(window,function(t){function e(e){for(var r,o,i=e[0],u=e[1],b=e[2],s=0,O=[];s0}function h(){return new d.a(new URL(location.href))}var m=n(93),y=n(97);function g(){return location.hash.substring(1)}function w(t){var e=document.createElement("a");e.href=t,e.click()}function $(){return Object(c.a)(window,"hashchange").pipe(Object(O.a)(g),Object(m.a)(g()),Object(y.a)((function(t){return t.length>0})),Object(l.a)())}function x(t){var e=t.location$,n=new DOMParser;return e.pipe(Object(b.a)("pathname"),Object(f.a)(1),Object(s.a)((function(t){return Object(u.a)({url:t.href,responseType:"text",withCredentials:!0}).pipe(Object(O.a)((function(e){var r=e.response;return history.pushState({},"",t.toString()),n.parseFromString(r,"text/html")})),Object(j.a)((function(){return function(t){location.href=t.href}(t),a.a})))})),Object(l.a)())}function S(t){var e=(void 0===t?{}:t).location$;return Object(r.a)(Object(c.a)(document,"DOMContentLoaded").pipe(Object(o.a)(document)),void 0!==e?x({location$:e}):a.a).pipe(Object(i.a)(1))}function T(t,e){return void 0===e&&(e=document),e.querySelector(t)||void 0}function C(t,e){void 0===e&&(e=document);var n=T(t,e);if(void 0===n)throw new ReferenceError('Missing element: expected "'+t+'" to be present');return n}function k(){return document.activeElement instanceof HTMLElement?document.activeElement:void 0}function A(t,e){return void 0===e&&(e=document),Array.from(e.querySelectorAll(t))}function _(t,e){void 0===e&&(e=!0),e?t.focus():t.blur()}function L(t){var e=Object(c.a)(t,"focus"),n=Object(c.a)(t,"blur");return Object(r.a)(e.pipe(Object(o.a)(!0)),n.pipe(Object(o.a)(!1))).pipe(Object(m.a)(t===k()),Object(i.a)(1))}function E(t){return{x:t.scrollLeft,y:t.scrollTop}}function N(t){return Object(r.a)(Object(c.a)(t,"scroll"),Object(c.a)(window,"resize")).pipe(Object(O.a)((function(){return E(t)})),Object(m.a)(E(t)),Object(i.a)(1))}function M(t){if(!(t instanceof HTMLInputElement))throw new Error("Not implemented");t.select()}var R=n(0),H=n(82),P=n(102);function U(t){return Object(P.a)((function(e){new H.a((function(t){var n=Object(R.c)(t,1)[0].contentRect;return e({width:Math.round(n.width),height:Math.round(n.height)})})).observe(t)})).pipe(Object(m.a)(function(t){return{width:t.offsetWidth,height:t.offsetHeight}}(t)),Object(i.a)(1))}function q(t){switch(t.tagName){case"INPUT":case"SELECT":case"TEXTAREA":return!0;default:return t.isContentEditable}}function Q(){return Object(c.a)(window,"keydown").pipe(Object(y.a)((function(t){return!(t.metaKey||t.ctrlKey)})),Object(O.a)((function(t){return{type:t.key,claim:function(){t.preventDefault(),t.stopPropagation()}}})),Object(l.a)())}function V(t){var e=matchMedia(t);return Object(P.a)((function(t){return e.addListener((function(){return t(e.matches)}))})).pipe(Object(m.a)(e.matches),Object(i.a)(1))}var z={drawer:C("[data-md-toggle=drawer]"),search:C("[data-md-toggle=search]")};function I(t){return z[t].checked}function D(t,e){z[t].checked!==e&&z[t].click()}function W(t){var e=z[t];return Object(c.a)(e,"change").pipe(Object(O.a)((function(){return e.checked})),Object(m.a)(e.checked))}var J=n(50);function B(){return{x:Math.max(0,pageXOffset),y:Math.max(0,pageYOffset)}}function F(t){var e=t.x,n=t.y;window.scrollTo(e||0,n||0)}function K(){return{width:innerWidth,height:innerHeight}}function Y(){return Object(J.a)([Object(r.a)(Object(c.a)(window,"scroll"),Object(c.a)(window,"resize")).pipe(Object(O.a)(B),Object(m.a)(B())),Object(c.a)(window,"resize").pipe(Object(O.a)(K),Object(m.a)(K()))]).pipe(Object(O.a)((function(t){var e=Object(R.c)(t,2);return{offset:e[0],size:e[1]}})),Object(i.a)(1))}function X(t,e){var n=e.header$,r=e.viewport$,c=Object(J.a)([r.pipe(Object(b.a)("size")),n]).pipe(Object(O.a)((function(){return{x:t.offsetLeft,y:t.offsetTop}})));return Object(J.a)([n,r,c]).pipe(Object(O.a)((function(t){var e=Object(R.c)(t,3),n=e[0].height,r=e[1],c=r.offset,a=r.size,o=e[2],i=o.x,u=o.y;return{offset:{x:c.x-i,y:c.y-u+n},size:a}})),Object(i.a)(1))}var Z=n(103),G=n(104),tt=n(59),et=n(105);function nt(t,e){var n=e.tx$,r=Object(P.a)((function(e){return t.addEventListener("message",e)})).pipe(Object(Z.a)("data"));return n.pipe(Object(G.a)((function(){return r}),{leading:!0,trailing:!0}),Object(tt.a)((function(e){return t.postMessage(e)})),Object(et.a)(r),Object(l.a)())}},,,,function(t,e,n){"use strict";function r(t){return"object"==typeof t&&"object"==typeof t.url&&"string"==typeof t.url.base&&"object"==typeof t.url.worker&&"string"==typeof t.url.worker.search}n.d(e,"d",(function(){return r})),n.d(e,"b",(function(){return b})),n.d(e,"a",(function(){return O})),n.d(e,"f",(function(){return d})),n.d(e,"g",(function(){return p})),n.d(e,"e",(function(){return v})),n.d(e,"c",(function(){return h}));var c=n(0),a=n(84);function o(t){switch(t){case"svg":case"path":return document.createElementNS("http://www.w3.org/2000/svg",t);default:return document.createElement(t)}}function i(t,e,n){switch(e){case"xmlns":break;case"viewBox":case"d":"boolean"!=typeof n?t.setAttributeNS(null,e,n):n&&t.setAttributeNS(null,e,"");break;default:"boolean"!=typeof n?t.setAttribute(e,n):n&&t.setAttribute(e,"")}}function u(t,e){var n,r;if("string"==typeof e||"number"==typeof e)t.innerHTML+=e.toString();else if(e instanceof Node)t.appendChild(e);else if(Array.isArray(e))try{for(var a=Object(c.g)(e),o=a.next();!o.done;o=a.next()){u(t,o.value)}}catch(t){n={error:t}}finally{try{o&&!o.done&&(r=a.return)&&r.call(a)}finally{if(n)throw n.error}}}function b(t,e){for(var n,r,b,f,s=[],O=2;On){for(;" "!==t[n]&&--n>0;);return t.substring(0,n)+"..."}return t}function v(t){return t>999?((t+1)/1e3).toFixed(+((t-950)%1e3>99))+"k":t.toString()}function h(t){for(var e=0,n=0,r=t.length;n0&&Object(r.b)("p",{class:O},Object(r.g)(a,320))))}));return Object(r.b)("li",{class:i},a)}var l="md-source__facts",d="md-source__fact";function p(t){var e=t.map((function(t){return Object(r.b)("li",{class:d},t)}));return Object(r.b)("ul",{class:l},e)}var v="md-typeset__scrollwrap",h="md-typeset__table";function m(t){return Object(r.b)("div",{class:v},Object(r.b)("div",{class:h},t))}},,,,,,,function(t,e,n){"use strict";function r(t){t.style.webkitOverflowScrolling="touch"}function c(t){t.style.webkitOverflowScrolling=""}n.d(e,"b",(function(){return r})),n.d(e,"a",(function(){return c}))},,function(t,e,n){"use strict";n.d(e,"c",(function(){return m})),n.d(e,"a",(function(){return r})),n.d(e,"b",(function(){return h}));var r,c=n(0),a=n(25),o=n(39),i=n(56),u=n(113),b=n(111),f=n(8),s=n(89),O=n(92),j=n(24),l=n(103),d=n(46),p=n(1),v=n(5);function h(t){return t.type===r.RESULT}function m(t,e){var n=e.base,m=e.index,y=e.location$,g=new Worker(t),w=y.pipe(Object(b.a)(1),Object(f.a)((function(t){var e=t.href;return new URL(n,e).toString().replace(/\/$/,"")}))),$=new a.a,x=Object(p.y)(g,{tx$:$}).pipe(Object(s.a)(w),Object(f.a)((function(t){var e,n,r,a,o=Object(c.c)(t,2),i=o[0],u=o[1];if(h(i))try{for(var b=Object(c.g)(i.data),f=b.next();!f.done;f=b.next()){var s=f.value,O=s.article,j=s.sections;O.location=u+"/"+O.location;try{for(var l=(r=void 0,Object(c.g)(j)),d=l.next();!d.done;d=l.next()){var p=d.value;p.location=u+"/"+p.location}}catch(t){r={error:t}}finally{try{d&&!d.done&&(a=l.return)&&a.call(l)}finally{if(r)throw r.error}}}}catch(t){e={error:t}}finally{try{f&&!f.done&&(n=b.return)&&n.call(b)}finally{if(e)throw e.error}}return i})),Object(O.a)(1));function S(t){return 1===t.lang.length&&"en"===t.lang[0]}function T(t){return"[s-]+"===t.separator}return(void 0!==m?Object(o.a)(m):w.pipe(Object(j.a)((function(t){return Object(u.a)({url:t+"/search/search_index.json",responseType:"json",withCredentials:!0}).pipe(Object(l.a)("response"))})))).pipe(Object(f.a)((function(t){var e=t.config,n=Object(c.d)(t,["config"]);return Object(c.a)({config:{lang:S(e)?[Object(v.f)("search.config.lang")]:e.lang,separator:T(e)?Object(v.f)("search.config.separator"):e.separator},pipeline:Object(v.f)("search.config.pipeline").split(/\s*,\s*/).filter(Boolean)},n)}))).pipe(Object(f.a)((function(t){return{type:r.SETUP,data:t}})),Object(d.b)(i.a)).subscribe($.next.bind($)),{tx$:$,rx$:x}}!function(t){t[t.SETUP=0]="SETUP",t[t.DUMP=1]="DUMP",t[t.QUERY=2]="QUERY",t[t.RESULT=3]="RESULT"}(r||(r={}))},,,,,,,,function(t,e,n){"use strict";var r=n(71);n.o(r,"applyNavigationLayer")&&n.d(e,"applyNavigationLayer",(function(){return r.applyNavigationLayer})),n.o(r,"mountSearch")&&n.d(e,"mountSearch",(function(){return r.mountSearch})),n.o(r,"mountSearchQuery")&&n.d(e,"mountSearchQuery",(function(){return r.mountSearchQuery})),n.o(r,"mountSearchReset")&&n.d(e,"mountSearchReset",(function(){return r.mountSearchReset})),n.o(r,"mountSearchResult")&&n.d(e,"mountSearchResult",(function(){return r.mountSearchResult})),n.o(r,"mountTableOfContents")&&n.d(e,"mountTableOfContents",(function(){return r.mountTableOfContents})),n.o(r,"mountTabs")&&n.d(e,"mountTabs",(function(){return r.mountTabs})),n.o(r,"watchNavigationLayer")&&n.d(e,"watchNavigationLayer",(function(){return r.watchNavigationLayer}));var c=n(72);n.d(e,"applyNavigationLayer",(function(){return c.a})),n.d(e,"watchNavigationLayer",(function(){return c.b}));n(38)},function(t,e,n){"use strict";var r=n(75);n.o(r,"applyAnchorList")&&n.d(e,"applyAnchorList",(function(){return r.applyAnchorList})),n.o(r,"mountNavigation")&&n.d(e,"mountNavigation",(function(){return r.mountNavigation})),n.o(r,"watchAnchorList")&&n.d(e,"watchAnchorList",(function(){return r.watchAnchorList}));var c=n(76);n.d(e,"applyAnchorList",(function(){return c.a})),n.d(e,"watchAnchorList",(function(){return c.b}));n(23)},,,,,,,,,,,,,,,,,function(t,e,n){"use strict";var r=n(67);n.d(e,"mountNavigation",(function(){return r.a}));var c=n(48);n.o(c,"mountSearch")&&n.d(e,"mountSearch",(function(){return c.mountSearch})),n.o(c,"mountSearchQuery")&&n.d(e,"mountSearchQuery",(function(){return c.mountSearchQuery})),n.o(c,"mountSearchReset")&&n.d(e,"mountSearchReset",(function(){return c.mountSearchReset})),n.o(c,"mountSearchResult")&&n.d(e,"mountSearchResult",(function(){return c.mountSearchResult})),n.o(c,"mountTableOfContents")&&n.d(e,"mountTableOfContents",(function(){return c.mountTableOfContents})),n.o(c,"mountTabs")&&n.d(e,"mountTabs",(function(){return c.mountTabs}))},function(t,e,n){"use strict";n.d(e,"a",(function(){return b}));var r=n(35),c=n(24),a=n(8),o=n(1),i=n(30),u=n(48);function b(t){var e=t.header$,n=t.main$,b=t.viewport$,f=t.screen$;return Object(r.a)(Object(c.a)((function(t){return f.pipe(Object(c.a)((function(r){if(r)return Object(i.watchSidebar)(t,{main$:n,viewport$:b}).pipe(Object(i.applySidebar)(t,{header$:e}),Object(a.a)((function(t){return{sidebar:t}})));var c=Object(o.d)("nav",t);return Object(u.watchNavigationLayer)(c).pipe(Object(u.applyNavigationLayer)(c),Object(a.a)((function(t){return{layer:t}})))})))})))}},function(t,e,n){"use strict";var r=n(69);n.o(r,"applySidebar")&&n.d(e,"applySidebar",(function(){return r.applySidebar})),n.o(r,"mountNavigation")&&n.d(e,"mountNavigation",(function(){return r.mountNavigation})),n.o(r,"mountTableOfContents")&&n.d(e,"mountTableOfContents",(function(){return r.mountTableOfContents})),n.o(r,"mountTabs")&&n.d(e,"mountTabs",(function(){return r.mountTabs})),n.o(r,"watchSidebar")&&n.d(e,"watchSidebar",(function(){return r.watchSidebar}));var c=n(70);n.d(e,"applySidebar",(function(){return c.a})),n.d(e,"watchSidebar",(function(){return c.b}));n(20)},function(t,e){},function(t,e,n){"use strict";n.d(e,"b",(function(){return l})),n.d(e,"a",(function(){return d}));var r=n(0),c=n(50),a=n(35),o=n(60),i=n(8),u=n(45),b=n(46),f=n(89),s=n(59),O=n(64),j=n(20);function l(t,e){var n=e.main$,a=e.viewport$,o=t.parentElement.offsetTop-t.parentElement.parentElement.offsetTop,b=Object(c.a)([n,a]).pipe(Object(i.a)((function(t){var e=Object(r.c)(t,2),n=e[0],c=n.offset,a=n.height,i=e[1].offset.y;return a+Math.min(o,Math.max(0,i-c))-o})),Object(u.a)()),f=Object(c.a)([n,a]).pipe(Object(i.a)((function(t){var e=Object(r.c)(t,2),n=e[0].offset;return e[1].offset.y>=n+o})),Object(u.a)());return Object(c.a)([b,f]).pipe(Object(i.a)((function(t){var e=Object(r.c)(t,2);return{height:e[0],lock:e[1]}})))}function d(t,e){var n=e.header$;return Object(a.a)(Object(b.b)(o.a),Object(f.a)(n),Object(s.a)((function(e){var n=Object(r.c)(e,2),c=n[0],a=c.height,o=c.lock,i=n[1].height;Object(j.d)(t,a),Object(j.e)(t,o),o?Object(j.f)(t,i):Object(j.c)(t)})),Object(i.a)((function(t){return Object(r.c)(t,1)[0]})),Object(O.a)((function(){Object(j.c)(t),Object(j.a)(t),Object(j.b)(t)})))}},function(t,e){},function(t,e,n){"use strict";n.d(e,"b",(function(){return v})),n.d(e,"a",(function(){return h}));var r=n(0),c=n(91),a=n(88),o=n(86),i=n(35),u=n(60),b=n(8),f=n(63),s=n(46),O=n(59),j=n(94),l=n(64),d=n(1),p=n(38);function v(t){var e,n,i=new Map;try{for(var u=Object(r.g)(t),s=u.next();!s.done;s=u.next()){var O=s.value,j=Object(d.b)("label",O);if(void 0!==j){var l=Object(d.c)("#"+j.htmlFor);i.set(l,O)}}}catch(t){e={error:t}}finally{try{s&&!s.done&&(n=u.return)&&n.call(u)}finally{if(e)throw e.error}}return a.a.apply(void 0,Object(r.e)(Object(r.e)(i.keys()).map((function(t){return Object(o.a)(t,"change")})))).pipe(Object(b.a)((function(){return Object(d.c)(".md-nav__list",i.get(Object(c.a)((function(t){return t.checked}),Object(r.e)(i.keys()))))}))).pipe(Object(b.a)((function(t){return{next:t}})),Object(f.a)((function(t,e){return{prev:t.next,next:e.next}})))}function h(t){return Object(i.a)(Object(s.b)(u.a),Object(O.a)((function(t){var e=t.prev;e&&Object(p.a)(e)})),Object(j.a)(250),Object(s.b)(u.a),Object(O.a)((function(t){var e=t.next;Object(p.b)(e)})),Object(l.a)((function(){var e,n;try{for(var c=Object(r.g)(t),a=c.next();!a.done;a=c.next()){var o=a.value;Object(p.a)(Object(d.c)(".md-nav__list",o))}}catch(t){e={error:t}}finally{try{a&&!a.done&&(n=c.return)&&n.call(c)}finally{if(e)throw e.error}}})))}},function(t,e,n){"use strict";var r=n(74);n.d(e,"mountTableOfContents",(function(){return r.a}));var c=n(49);n.o(c,"mountNavigation")&&n.d(e,"mountNavigation",(function(){return c.mountNavigation}))},function(t,e,n){"use strict";n.d(e,"a",(function(){return O}));var r=n(0),c=n(35),a=n(50),o=n(44),i=n(24),u=n(8),b=n(1),f=n(30),s=n(49);function O(t){var e=t.header$,n=t.main$,O=t.viewport$,j=t.tablet$;return Object(c.a)(Object(i.a)((function(t){return j.pipe(Object(i.a)((function(c){if(c){var i=Object(b.d)(".md-nav__link",t),j=Object(f.watchSidebar)(t,{main$:n,viewport$:O}).pipe(Object(f.applySidebar)(t,{header$:e})),l=Object(s.watchAnchorList)(i,{header$:e,viewport$:O}).pipe(Object(s.applyAnchorList)(i));return Object(a.a)([j,l]).pipe(Object(u.a)((function(t){var e=Object(r.c)(t,2);return{sidebar:e[0],anchors:e[1]}})))}return Object(o.a)({})})))})))}},function(t,e){},function(t,e,n){"use strict";n.d(e,"b",(function(){return y})),n.d(e,"a",(function(){return g}));var r=n(0),c=n(95),a=n(50),o=n(35),i=n(60),u=n(8),b=n(87),f=n(24),s=n(63),O=n(45),j=n(93),l=n(90),d=n(46),p=n(59),v=n(64),h=n(1),m=n(23);function y(t,e){var n,o,i=e.header$,d=e.viewport$,p=new Map;try{for(var v=Object(r.g)(t),m=v.next();!m.done;m=v.next()){var y=m.value,g=decodeURIComponent(y.hash.substring(1)),w=Object(h.b)('[id="'+g+'"]');void 0!==w&&p.set(y,w)}}catch(t){n={error:t}}finally{try{m&&!m.done&&(o=v.return)&&o.call(v)}finally{if(n)throw n.error}}var $=i.pipe(Object(u.a)((function(t){return 18+t.height})));return d.pipe(Object(b.a)("size"),Object(u.a)((function(){var t=[];return Object(r.e)(p).reduce((function(e,n){for(var a=Object(r.c)(n,2),o=a[0],i=a[1];t.length;){if(!(p.get(t[t.length-1]).tagName>=i.tagName))break;t.pop()}for(var u=i.offsetTop;!u&&i.parentElement;)u=(i=i.parentElement).offsetTop;return e.set(Object(c.a)(t=Object(r.e)(t,[o])),u)}),new Map)})),Object(f.a)((function(t){return Object(a.a)([$,d]).pipe(Object(s.a)((function(t,e){for(var n=Object(r.c)(t,2),c=n[0],a=n[1],o=Object(r.c)(e,2),i=o[0],u=o[1].offset.y;a.length;){if(!(Object(r.c)(a[0],2)[1]-i=u))break;a=Object(r.e)([c.pop()],a)}return[c,a]}),[[],Object(r.e)(t)]),Object(O.a)((function(t,e){return t[0]===e[0]&&t[1]===e[1]})))}))).pipe(Object(u.a)((function(t){var e=Object(r.c)(t,2),n=e[0],c=e[1];return{prev:n.map((function(t){return Object(r.c)(t,1)[0]})),next:c.map((function(t){return Object(r.c)(t,1)[0]}))}})),Object(j.a)({prev:[],next:[]}),Object(l.a)(2,1),Object(u.a)((function(t){var e=Object(r.c)(t,2),n=e[0],c=e[1];return n.prev.length16)););return n}),0),Object(g.a)(e),Object(L.a)((function(){!function(t){t.innerHTML=""}(u)})))})))}function H(t,e){var n=t.rx$,r=e.query$;return Object(c.a)(Object(o.a)((function(t){var e=t.parentElement,c=Object(f.p)(e).pipe(Object(i.a)((function(t){return t.y>=e.scrollHeight-e.offsetHeight-16})),Object(p.a)(),Object(S.a)(x.a));return n.pipe(Object(S.a)(s.b),Object(T.a)("data"),R(t,{query$:r,fetch$:c}))})))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return y}));var r=n(0),c=n(35),a=n(50),o=n(24),i=n(8),u=n(97),b=n(89),f=n(45),s=n(93),O=n(92),j=n(1),l=n(21),d=n(44),p=n(60),v=n(46),h=n(59),m=n(64);function y(t){var e=t.viewport$;return Object(c.a)(Object(o.a)((function(t){var n=function(t){var e=getComputedStyle(t);return["sticky","-webkit-sticky"].includes(e.position)?Object(j.q)(t).pipe(Object(i.a)((function(t){return{sticky:!0,height:t.height}})),Object(O.a)(1)):Object(d.a)({sticky:!1,height:0})}(t),y=Object(l.b)("main").pipe(Object(i.a)((function(t){return Object(j.b)("h1, h2, h3, h4, h5, h6",t)})),Object(u.a)((function(t){return void 0!==t})),Object(b.a)(Object(l.b)("header-title")),Object(o.a)((function(t){var a=Object(r.c)(t,2),o=a[0],u=a[1];return Object(j.x)(o,{header$:n,viewport$:e}).pipe(Object(i.a)((function(t){return t.offset.y>=o.offsetHeight?"page":"site"})),Object(f.a)(),function(t){return Object(c.a)(Object(v.b)(p.a),Object(h.a)((function(e){!function(t,e){t.setAttribute("data-md-state",e?"active":"")}(t,"page"===e)})),Object(m.a)((function(){!function(t){t.removeAttribute("data-md-state")}(t)})))}(u))})),Object(s.a)("site"));return Object(a.a)([n,y]).pipe(Object(i.a)((function(t){var e=Object(r.c)(t,2),n=e[0],c=e[1];return Object(r.a)({type:c},n)})),Object(O.a)(1))})))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return O}));var r=n(35),c=n(24),a=n(8),o=n(45),i=n(1),u=n(60),b=n(46),f=n(59),s=n(64);function O(t){var e=t.header$,n=t.viewport$;return Object(r.a)(Object(c.a)((function(t){return Object(i.x)(t,{header$:e,viewport$:n}).pipe(Object(a.a)((function(t){return{hidden:t.offset.y>=20}})),Object(o.a)(),function(t){return Object(r.a)(Object(b.b)(u.a),Object(f.a)((function(e){var n=e.hidden;!function(t,e){t.setAttribute("data-md-state",e?"hidden":"")}(t,n)})),Object(s.a)((function(){!function(t){t.removeAttribute("data-md-state")}(t)})))}(t))})))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return m}));var r=n(25),c=n(35),a=n(24),o=n(87),i=n(59),u=n(21),b=n(0),f=n(50),s=n(60),O=n(103),j=n(45),l=n(92),d=n(8),p=n(46),v=n(64),h=n(1);function m(t){var e=t.header$,n=t.viewport$,m=new r.a;return Object(u.b)("header").pipe(Object(a.a)((function(t){return m.pipe(Object(o.a)("active"),(e=t,Object(c.a)(Object(p.b)(s.a),Object(i.a)((function(t){var n=t.active;!function(t,e){t.setAttribute("data-md-state",e?"shadow":"")}(e,n)})),Object(v.a)((function(){!function(t){t.removeAttribute("data-md-state")}(e)})))));var e}))).subscribe(),Object(c.a)(Object(a.a)((function(t){return function(t,e){var n=e.header$,r=e.viewport$,c=n.pipe(Object(O.a)("height"),Object(j.a)(),Object(l.a)(1)),i=c.pipe(Object(a.a)((function(){return Object(h.q)(t).pipe(Object(d.a)((function(e){var n=e.height;return{top:t.offsetTop,bottom:t.offsetTop+n}})))})),Object(o.a)("top"),Object(l.a)(1)),u=Object(f.a)([c,i,r]).pipe(Object(d.a)((function(t){var e=Object(b.c)(t,3),n=e[0],r=e[1],c=r.top,a=r.bottom,o=e[2],i=o.offset.y,u=o.size.height;return u-Math.max(0,c-i,n)-Math.max(0,u+i-a)})),Object(d.a)((function(t){return Math.max(0,t)})),Object(j.a)()),s=Object(f.a)([c,i,r]).pipe(Object(d.a)((function(t){var e=Object(b.c)(t,3),n=e[0],r=e[1].top;return e[2].offset.y>=r-n})),Object(j.a)());return Object(f.a)([c,i,u,s]).pipe(Object(d.a)((function(t){var e=Object(b.c)(t,4),n=e[0];return{offset:e[1].top-n,height:e[2],active:e[3]}})))}(t,{header$:e,viewport$:n})})),Object(i.a)((function(t){return m.next(t)})))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return j}));var r=n(35),c=n(44),a=n(24),o=n(8),i=n(45),u=n(1),b=n(60),f=n(46),s=n(59),O=n(64);function j(t){var e=t.header$,n=t.viewport$,j=t.screen$;return Object(r.a)(Object(a.a)((function(t){return j.pipe(Object(a.a)((function(a){return a?Object(u.x)(t,{header$:e,viewport$:n}).pipe(Object(o.a)((function(t){return{hidden:t.offset.y>=10}})),Object(i.a)(),function(t){return Object(r.a)(Object(f.b)(b.a),Object(s.a)((function(e){var n=e.hidden;!function(t,e){t.setAttribute("data-md-state",e?"hidden":"")}(t,n)})),Object(O.a)((function(){!function(t){t.removeAttribute("data-md-state")}(t)})))}(t)):Object(c.a)({hidden:!0})})))})))}},,,,function(t,e,n){"use strict";n.r(e),n.d(e,"setScrollLock",(function(){return D})),n.d(e,"resetScrollLock",(function(){return W})),n.d(e,"initialize",(function(){return J}));var r=n(0),c=n(109),a=n(50),o=n(60),i=n(86),u=n(44),b=n(100),f=n(88),s=n(92),O=n(59),j=n(94),l=n(89),d=n(24),p=n(46),v=n(97),h=n(110),m=n(111),y=n(1),g=n(40),w=n(7),$=n(62),x=n(102),S=n(101),T=n(31),C=n(5);var k=n(25),A=n(8);var _=n(45),L=n(103),E=n(106),N=n(87),M=n(90),R=n(107);var H=n(112),P=n(105);var U=n(98);var q=n(108);function Q(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}var V=n(99),z=n(113);function I(t){switch(Object(r.c)(t.match(/(git(?:hub|lab))/i)||[],1)[0].toLowerCase()){case"github":var e=Object(r.c)(t.match(/^.+github\.com\/([^\/]+)\/?([^\/]+)/i),3);return function(t,e){return Object(z.a)({url:void 0!==e?"https://api.github.com/repos/"+t+"/"+e:"https://api.github.com/users/"+t,responseType:"json"}).pipe(Object(v.a)((function(t){return 200===t.status})),Object(L.a)("response"),Object(d.a)((function(t){if(void 0!==e){var n=t.stargazers_count,r=t.forks_count;return Object(u.a)([Object(C.e)(n||0)+" Stars",Object(C.e)(r||0)+" Forks"])}var c=t.public_repos;return Object(u.a)([Object(C.e)(c||0)+" Repositories"])})))}(e[1],e[2]);case"gitlab":var n=Object(r.c)(t.match(/^.+?([^\/]*gitlab[^\/]+)\/(.+)/i),3);return function(t,e){return Object(z.a)({url:"https://"+t+"/api/v4/projects/"+encodeURIComponent(e),responseType:"json"}).pipe(Object(v.a)((function(t){return 200===t.status})),Object(L.a)("response"),Object(A.a)((function(t){var e=t.star_count,n=t.forks_count;return[Object(C.e)(e)+" Stars",Object(C.e)(n)+" Forks"]})))}(n[1],n[2]);default:return b.a}}function D(t,e){t.setAttribute("data-md-state","lock"),t.style.top="-"+e+"px"}function W(t){var e=-1*parseInt(t.style.top,10);t.removeAttribute("data-md-state"),t.style.top="",e&&window.scrollTo(0,e)}function J(t){var e,n,z,J;if(!Object(C.d)(t))throw new SyntaxError("Invalid configuration: "+JSON.stringify(t));var B=Object(y.s)(),F=Object(y.t)(),K=Object(y.w)(),Y=Object(y.u)("(min-width: 960px)"),X=Object(y.u)("(min-width: 1220px)"),Z=t.features.includes("instant")?Object(y.n)({location$:B}):Object(y.n)();Object(w.setupComponents)(["container","header","header-title","hero","main","navigation","search","search-query","search-reset","search-result","skip","tabs","toc"],{document$:Z});var G=t.search&&t.search.index?t.search.index:void 0,tt=Object(g.c)(t.url.worker.search,{base:t.url.base,index:G,location$:B}),et=Object(w.useComponent)("header").pipe(Object(w.mountHeader)({viewport$:K}),Object(s.a)(1)),nt=Object(w.useComponent)("main").pipe(Object(w.mountMain)({header$:et,viewport$:K}),Object(s.a)(1)),rt=Object(w.useComponent)("search-query").pipe(Object(w.mountSearchQuery)(tt),Object(s.a)(1)),ct=Object(w.useComponent)("search-reset").pipe(Object(w.mountSearchReset)(),Object(s.a)(1)),at=Object(w.useComponent)("search-result").pipe(Object(w.mountSearchResult)(tt,{query$:rt}),Object(s.a)(1)),ot=Object(w.useComponent)("search").pipe(Object(w.mountSearch)({query$:rt,reset$:ct,result$:at}),Object(s.a)(1)),it=Object(w.useComponent)("navigation").pipe(Object(w.mountNavigation)({header$:et,main$:nt,viewport$:K,screen$:X}),Object(s.a)(1)),ut=Object(w.useComponent)("toc").pipe(Object(w.mountTableOfContents)({header$:et,main$:nt,viewport$:K,tablet$:Y}),Object(s.a)(1)),bt=Object(w.useComponent)("tabs").pipe(Object(w.mountTabs)({header$:et,viewport$:K,screen$:X}),Object(s.a)(1)),ft=Object(w.useComponent)("hero").pipe(Object(w.mountHero)({header$:et,viewport$:K}),Object(s.a)(1)),st=function(){var t=Object(y.r)().pipe(Object(A.a)((function(t){return Object(r.a)({mode:Object(y.e)("search")?"search":"global"},t)})),Object(h.a)());return t.pipe(Object(v.a)((function(t){return"search"===t.mode})),Object(l.a)(Object(w.useComponent)("search-query"),Object(w.useComponent)("search-result"))).subscribe((function(t){var e=Object(r.c)(t,3),n=e[0],c=e[1],a=e[2],o=Object(y.a)();switch(n.type){case"Enter":o===c&&n.claim();break;case"Escape":case"Tab":Object(y.l)("search",!1),Object(y.i)(c,!1);break;case"ArrowUp":case"ArrowDown":if(void 0===o)Object(y.i)(c);else{var i=Object(r.e)([c],Object(y.d)("[href]",a)),u=Math.max(0,(Math.max(0,i.indexOf(o))+i.length+("ArrowUp"===n.type?-1:1))%i.length);Object(y.i)(i[u])}n.claim();break;default:c!==Object(y.a)()&&Object(y.i)(c)}})),t.pipe(Object(v.a)((function(t){if("global"===t.mode){var e=Object(y.a)();if(void 0!==e)return!Object(y.h)(e)}return!1})),Object(l.a)(Object(w.useComponent)("search-query"))).subscribe((function(t){var e=Object(r.c)(t,2),n=e[0],c=e[1];switch(n.type){case"f":case"s":case"/":Object(y.i)(c),Object(y.j)(c),n.claim();break;case"p":case",":var a=Object(y.b)("[href][rel=prev]");void 0!==a&&a.click();break;case"n":case".":var o=Object(y.b)("[href][rel=next]");void 0!==o&&o.click()}})),t}();!function(t){var e=t.document$,n=t.hash$,c=e.pipe(Object(A.a)((function(){return Object(y.d)("details")})));Object(f.a)(Object(y.u)("print").pipe(Object(v.a)(H.a)),Object(i.a)(window,"beforeprint")).pipe(Object(P.a)(c)).subscribe((function(t){var e,n;try{for(var c=Object(r.g)(t),a=c.next();!a.done;a=c.next()){a.value.setAttribute("open","")}}catch(t){e={error:t}}finally{try{a&&!a.done&&(n=c.return)&&n.call(c)}finally{if(e)throw e.error}}})),n.pipe(Object(A.a)((function(t){return Object(y.b)('[id="'+t+'"]')})),Object(v.a)((function(t){return void 0!==t})),Object(O.a)((function(t){var e=t.closest("details");e&&!e.open&&e.setAttribute("open","")}))).subscribe((function(t){return t.scrollIntoView()}))}({document$:Z,hash$:F}),function(t){t.document$.pipe(Object(U.a)(1),Object(l.a)(Object(w.useComponent)("container")),Object(A.a)((function(t){var e=Object(r.c)(t,2)[1];return Object(y.d)("script",e)}))).subscribe((function(t){var e,n;try{for(var c=Object(r.g)(t),a=c.next();!a.done;a=c.next()){var o=a.value;if(o.src||/(^|\/javascript)$/i.test(o.type)){var i=document.createElement("script"),u=o.src?"src":"textContent";i[u]=o[u],o.replaceWith(i)}}}catch(t){e={error:t}}finally{try{a&&!a.done&&(n=c.return)&&n.call(c)}finally{if(e)throw e.error}}}))}({document$:Z}),function(t){t.document$.pipe(Object(A.a)((function(){return Object(y.c)(".md-source[href]")})),Object(d.a)((function(t){var e=t.href;return Object(C.a)(""+Object(C.c)(e),(function(){return I(e)}))})),Object(V.a)((function(){return b.a}))).subscribe((function(t){var e,n;try{for(var c=Object(r.g)(Object(y.d)(".md-source__repository")),a=c.next();!a.done;a=c.next()){var o=a.value;o.hasAttribute("data-md-state")||(o.setAttribute("data-md-state","done"),o.appendChild(Object(T.c)(t)))}}catch(t){e={error:t}}finally{try{a&&!a.done&&(n=c.return)&&n.call(c)}finally{if(e)throw e.error}}}))}({document$:Z}),function(t){var e=t.document$,n=document.createElement("table");e.pipe(Object(A.a)((function(){return Object(y.d)("table:not([class])")}))).subscribe((function(t){var e,c;try{for(var a=Object(r.g)(t),o=a.next();!o.done;o=a.next()){var i=o.value;i.replaceWith(n),n.replaceWith(Object(T.d)(i))}}catch(t){e={error:t}}finally{try{o&&!o.done&&(c=a.return)&&c.call(a)}finally{if(e)throw e.error}}}))}({document$:Z}),function(t){var e=t.document$.pipe(Object(A.a)((function(){return Object(y.d)("[data-md-scrollfix]")})),Object(s.a)(1));e.subscribe((function(t){var e,n;try{for(var c=Object(r.g)(t),a=c.next();!a.done;a=c.next()){a.value.removeAttribute("data-md-scrollfix")}}catch(t){e={error:t}}finally{try{a&&!a.done&&(n=c.return)&&n.call(c)}finally{if(e)throw e.error}}})),Object(q.a)(Q,e,b.a).pipe(Object(d.a)((function(t){return f.a.apply(void 0,Object(r.e)(t.map((function(t){return Object(i.a)(t,"touchstart").pipe(Object(S.a)(t))}))))}))).subscribe((function(t){var e=t.scrollTop;0===e?t.scrollTop=1:e+t.offsetHeight===t.scrollHeight&&(t.scrollTop=e-1)}))}({document$:Z});var Ot=function(t){var e=(void 0===t?{}:t).duration,n=new k.a,r=document.createElement("div");return r.classList.add("md-dialog","md-typeset"),n.pipe(Object(d.a)((function(t){return Object(u.a)(document.body).pipe(Object(A.a)((function(t){return t.appendChild(r)})),Object(p.b)(o.a),Object(j.a)(1),Object(O.a)((function(e){e.innerHTML=t,e.setAttribute("data-md-state","open")})),Object(j.a)(e||2e3),Object(O.a)((function(t){return t.removeAttribute("data-md-state")})),Object(j.a)(400),Object(O.a)((function(t){t.innerHTML="",t.remove()})))}))).subscribe(),n}(),jt=function(t){var e=t.document$,n=t.dialog$;if(!$.isSupported())return b.a;e.subscribe((function(){Object(y.d)("pre > code").forEach((function(t,e){var n=t.parentElement;n.id="__code_"+e,n.insertBefore(Object(T.a)(n.id),t)}))}));var r=Object(x.a)((function(t){new $(".md-clipboard").on("success",t)})).pipe(Object(h.a)());return r.pipe(Object(O.a)((function(t){return t.clearSelection()})),Object(S.a)(Object(C.f)("clipboard.copied"))).subscribe(n),r}({document$:Z,dialog$:Ot});F.pipe(Object(O.a)((function(){return Object(y.l)("search",!1)})),Object(j.a)(125)).subscribe((function(t){return Object(y.k)("#"+t)})),Object(a.a)([Object(y.v)("search"),Y]).pipe(Object(l.a)(K),Object(d.a)((function(t){var e=Object(r.c)(t,2),n=Object(r.c)(e[0],2),c=n[0],a=n[1],i=e[1].offset.y,u=c&&!a;return Z.pipe(Object(j.a)(u?400:100),Object(p.b)(o.a),Object(O.a)((function(t){var e=t.body;return u?D(e,i):W(e)})))}))).subscribe();var lt=Object(i.a)(document.body,"click").pipe(Object(v.a)((function(t){return!(t.metaKey||t.ctrlKey)})),Object(d.a)((function(e){if(e.target instanceof HTMLElement){var n=e.target.closest("a");if(n&&Object(y.g)(n))return!Object(y.f)(n)&&t.features.includes("instant")&&e.preventDefault(),Object(u.a)(n)}return b.a})),Object(h.a)());if(lt.subscribe((function(){Object(y.l)("drawer",!1)})),t.features.includes("instant")){"scrollRestoration"in history&&(history.scrollRestoration="manual");try{for(var dt=Object(r.g)(['link[rel="shortcut icon"]']),pt=dt.next();!pt.done;pt=dt.next()){var vt=pt.value;try{for(var ht=(z=void 0,Object(r.g)(Object(y.d)(vt))),mt=ht.next();!mt.done;mt=ht.next()){var yt=mt.value;yt.href=yt.href}}catch(t){z={error:t}}finally{try{mt&&!mt.done&&(J=ht.return)&&J.call(ht)}finally{if(z)throw z.error}}}}catch(t){e={error:t}}finally{try{pt&&!pt.done&&(n=dt.return)&&n.call(dt)}finally{if(e)throw e.error}}!function(t){var e=t.document$,n=t.viewport$,c=t.link$,a=t.location$,o=c.pipe(Object(A.a)((function(t){return{url:new URL(t.href)}})),Object(h.a)()),u=o.pipe(Object(_.a)((function(t,e){return t.url.href===e.url.href})),Object(v.a)((function(t){var e=t.url;return!Object(y.f)(e)})),Object(h.a)()),b=Object(i.a)(window,"popstate").pipe(Object(v.a)((function(t){return null!==t.state})),Object(A.a)((function(t){return{url:new URL(location.href),offset:t.state}})),Object(h.a)());Object(f.a)(u,b).pipe(Object(L.a)("url")).subscribe(a),n.pipe(Object(E.a)(250),Object(N.a)("offset")).subscribe((function(t){var e=t.offset;history.replaceState(e,"")})),Object(f.a)(o,b).pipe(Object(M.a)(2,1),Object(v.a)((function(t){var e=Object(r.c)(t,2),n=e[0],c=e[1];return n.url.pathname===c.url.pathname&&!Object(y.f)(c.url)})),Object(A.a)((function(t){return Object(r.c)(t,2)[1]}))).subscribe((function(t){var e=t.offset;Object(y.m)(e||{y:0})}));var s=Object(f.a)(u,b).pipe(Object(R.a)(e));s.subscribe((function(t){var e=t.url,n=t.offset;e.hash&&!n?Object(y.k)(e.hash):Object(y.m)(n||{y:0})})),s.pipe(Object(l.a)(e)).subscribe((function(t){var e,n,c=Object(r.c)(t,2)[1],a=c.title,o=c.head;document.dispatchEvent(new CustomEvent("DOMContentSwitch")),document.title=a;try{for(var i=Object(r.g)(['link[rel="canonical"]','meta[name="author"]','meta[name="description"]']),u=i.next();!u.done;u=i.next()){var b=u.value,f=Object(y.b)(b,o),s=Object(y.b)(b,document.head);void 0!==f&&void 0!==s&&s.replaceWith(f)}}catch(t){e={error:t}}finally{try{u&&!u.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}}))}({document$:Z,link$:lt,location$:B,viewport$:K})}st.pipe(Object(v.a)((function(t){return"global"===t.mode&&["Tab"].includes(t.type)})),Object(m.a)(1)).subscribe((function(){var t,e;try{for(var n=Object(r.g)(Object(y.d)(".headerlink")),c=n.next();!c.done;c=n.next()){c.value.style.visibility="visible"}}catch(e){t={error:e}}finally{try{c&&!c.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}}));var gt={document$:Z,viewport$:K,header$:et,hero$:ft,main$:nt,navigation$:it,search$:ot,tabs$:bt,toc$:ut,clipboard$:jt,keyboard$:st,dialog$:Ot};return f.a.apply(void 0,Object(r.e)(Object(c.a)(gt))).subscribe(),gt}document.documentElement.classList.remove("no-js"),document.documentElement.classList.add("js"),navigator.userAgent.match(/(iPad|iPhone|iPod)/g)&&document.documentElement.classList.add("ios")}]));
-//# sourceMappingURL=bundle.bdb82690.min.js.map
\ No newline at end of file
+//# sourceMappingURL=bundle.546b0e0d.min.js.map
\ No newline at end of file
diff --git a/material/assets/javascripts/bundle.bdb82690.min.js.map b/material/assets/javascripts/bundle.546b0e0d.min.js.map
similarity index 99%
rename from material/assets/javascripts/bundle.bdb82690.min.js.map
rename to material/assets/javascripts/bundle.546b0e0d.min.js.map
index 4db18a8b1..44e1675ef 100644
--- a/material/assets/javascripts/bundle.bdb82690.min.js.map
+++ b/material/assets/javascripts/bundle.546b0e0d.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/assets/javascripts/browser/location/_/index.ts","webpack:///./src/assets/javascripts/browser/location/hash/index.ts","webpack:///./src/assets/javascripts/browser/document/switch/index.ts","webpack:///./src/assets/javascripts/browser/document/_/index.ts","webpack:///./src/assets/javascripts/browser/element/_/index.ts","webpack:///./src/assets/javascripts/browser/element/focus/index.ts","webpack:///./src/assets/javascripts/browser/element/offset/index.ts","webpack:///./src/assets/javascripts/browser/element/select/index.ts","webpack:///./src/assets/javascripts/browser/element/size/index.ts","webpack:///./src/assets/javascripts/browser/keyboard/index.ts","webpack:///./src/assets/javascripts/browser/media/index.ts","webpack:///./src/assets/javascripts/browser/toggle/index.ts","webpack:///./src/assets/javascripts/browser/viewport/offset/index.ts","webpack:///./src/assets/javascripts/browser/viewport/size/index.ts","webpack:///./src/assets/javascripts/browser/viewport/_/index.ts","webpack:///./src/assets/javascripts/browser/worker/index.ts","webpack:///./src/assets/javascripts/utilities/config/index.ts","webpack:///./src/assets/javascripts/utilities/jsx/index.ts","webpack:///./src/assets/javascripts/utilities/rxjs/index.ts","webpack:///./src/assets/javascripts/utilities/string/index.ts","webpack:///./src/assets/javascripts/components/index.ts","webpack:///./src/assets/javascripts/components/shared/sidebar/set/index.ts","webpack:///./src/assets/javascripts/components/_/index.ts","webpack:///./src/assets/javascripts/components/toc/anchor/set/index.ts","webpack:///./src/assets/javascripts/components/shared/index.ts","webpack:///./src/assets/javascripts/templates/clipboard/index.tsx","webpack:///./src/assets/javascripts/templates/search/index.tsx","webpack:///./src/assets/javascripts/templates/source/index.tsx","webpack:///./src/assets/javascripts/templates/table/index.tsx","webpack:///./src/assets/javascripts/components/navigation/layer/set/index.ts","webpack:///./src/assets/javascripts/workers/search/message/index.ts","webpack:///./src/assets/javascripts/workers/search/_/index.ts","webpack:///./src/assets/javascripts/components/navigation/layer/index.ts","webpack:///./src/assets/javascripts/components/toc/anchor/index.ts","webpack:///./src/assets/javascripts/components/navigation/index.ts","webpack:///./src/assets/javascripts/components/navigation/_/index.ts","webpack:///./src/assets/javascripts/components/shared/sidebar/index.ts","webpack:///./src/assets/javascripts/components/shared/sidebar/react/index.ts","webpack:///./src/assets/javascripts/components/navigation/layer/react/index.ts","webpack:///./src/assets/javascripts/components/toc/index.ts","webpack:///./src/assets/javascripts/components/toc/_/index.ts","webpack:///./src/assets/javascripts/components/toc/anchor/react/index.ts","webpack:///./src/assets/javascripts/components/search/_/index.ts","webpack:///./src/assets/javascripts/components/search/query/react/index.ts","webpack:///./src/assets/javascripts/components/search/query/_/index.ts","webpack:///./src/assets/javascripts/components/search/reset/_/index.ts","webpack:///./src/assets/javascripts/components/search/reset/react/index.ts","webpack:///./src/assets/javascripts/components/search/result/set/index.ts","webpack:///./src/assets/javascripts/components/search/result/react/index.ts","webpack:///./src/assets/javascripts/components/search/result/_/index.ts","webpack:///./src/assets/javascripts/components/header/_/index.ts","webpack:///./src/assets/javascripts/components/header/react/index.ts","webpack:///./src/assets/javascripts/components/header/set/index.ts","webpack:///./src/assets/javascripts/components/hero/_/index.ts","webpack:///./src/assets/javascripts/components/hero/react/index.ts","webpack:///./src/assets/javascripts/components/hero/set/index.ts","webpack:///./src/assets/javascripts/components/main/_/index.ts","webpack:///./src/assets/javascripts/components/main/react/index.ts","webpack:///./src/assets/javascripts/components/main/set/index.ts","webpack:///./src/assets/javascripts/components/tabs/_/index.ts","webpack:///./src/assets/javascripts/components/tabs/react/index.ts","webpack:///./src/assets/javascripts/components/tabs/set/index.ts","webpack:///./src/assets/javascripts/patches/scrollfix/index.ts","webpack:///./src/assets/javascripts/patches/source/index.ts","webpack:///./src/assets/javascripts/patches/source/github/index.ts","webpack:///./src/assets/javascripts/patches/source/gitlab/index.ts","webpack:///./src/assets/javascripts/index.ts","webpack:///./src/assets/javascripts/integrations/keyboard/index.ts","webpack:///./src/assets/javascripts/patches/details/index.ts","webpack:///./src/assets/javascripts/patches/script/index.ts","webpack:///./src/assets/javascripts/patches/table/index.ts","webpack:///./src/assets/javascripts/integrations/dialog/index.ts","webpack:///./src/assets/javascripts/integrations/clipboard/index.ts","webpack:///./src/assets/javascripts/integrations/instant/index.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","0","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","isLocationInternal","url","ref","host","test","pathname","isLocationAnchor","hash","watchLocation","BehaviorSubject","URL","location","href","getLocationHash","substring","setLocationHash","el","document","createElement","click","watchLocationHash","fromEvent","pipe","map","startWith","filter","share","watchDocumentSwitch","location$","dom","DOMParser","distinctUntilKeyChanged","skip","switchMap","ajax","responseType","withCredentials","response","history","pushState","toString","parseFromString","catchError","setLocation","watchDocument","merge","mapTo","shareReplay","getElement","selector","node","querySelector","undefined","getElementOrThrow","ReferenceError","getActiveElement","activeElement","HTMLElement","getElements","Array","from","querySelectorAll","setElementFocus","focus","blur","watchElementFocus","focus$","blur$","getElementOffset","x","scrollLeft","y","scrollTop","watchElementOffset","setElementSelection","HTMLInputElement","Error","select","watchElementSize","fromEventPattern","next","contentRect","width","Math","round","height","observe","offsetWidth","offsetHeight","getElementSize","isSusceptibleToKeyboard","tagName","isContentEditable","watchKeyboard","ev","metaKey","ctrlKey","type","claim","preventDefault","stopPropagation","watchMedia","query","media","matchMedia","addListener","matches","toggles","drawer","search","getToggle","checked","setToggle","watchToggle","getViewportOffset","max","pageXOffset","pageYOffset","setViewportOffset","scrollTo","getViewportSize","innerWidth","innerHeight","watchViewport","combineLatest","offset","size","watchViewportAt","header$","viewport$","offset$","offsetLeft","offsetTop","watchWorker","worker","tx$","rx$","addEventListener","pluck","throttle","leading","trailing","tap","message","postMessage","switchMapTo","isConfig","config","base","tag","createElementNS","setAttribute","setAttributeNS","appendChild","child","innerHTML","Node","isArray","h","attributes","keys","attr","children","cache","factory","defer","sessionStorage","getItem","of","JSON","parse","value$","subscribe","setItem","stringify","err","lang","translate","textContent","replace","truncate","toFixed","len","charCodeAt","setSidebarOffset","style","top","resetSidebarOffset","setSidebarHeight","resetSidebarHeight","setSidebarLock","resetSidebarLock","removeAttribute","components$","setupComponents","names","document$","reduce","components","prev","replaceWith","useComponent","setAnchorBlur","resetAnchorBlur","setAnchorActive","classList","toggle","resetAnchorActive","remove","css","renderClipboard","id","class","title","xmlns","viewBox","renderSearchResult","article","sections","icon","text","tabIndex","renderSource","facts","fact","renderTable","table","setOverflowScrolling","webkitOverflowScrolling","resetOverflowScrolling","SearchMessageType","isSearchResultMessage","RESULT","setupSearchWorker","index","Worker","origin$","take","Subject","withLatestFrom","origin","section","isConfigDefaultLang","isConfigDefaultSeparator","separator","pipeline","split","Boolean","rest","SETUP","observeOn","mountNavigation","main$","screen$","screen","sidebar","els","layer","watchSidebar","adjust","parentElement","height$","min","lock$","lock","applySidebar","watchNavigationLayer","Map","label","input","htmlFor","set","applyNavigationLayer","mountTableOfContents","tablet$","tablet","sidebar$","anchors$","anchors","watchAnchorList","decodeURIComponent","target","adjust$","header","path","anchor","pop","a","b","applyAnchorList","forEach","mountSearch","query$","reset$","result$","defaultTransform","trim","mountSearchQuery","options","fn","transform","delay","distinctUntilChanged","watchSearchQuery","QUERY","mountSearchReset","watchSearchReset","addToSearchResultList","applySearchResult","fetch$","list","meta","setSearchResultMeta","resetSearchResultMeta","animationFrame","scan","container","scrollHeight","finalize","resetSearchResultList","mountSearchResult","identity","mountHeader","styles","getComputedStyle","includes","position","sticky","watchHeader","type$","main","hx","setHeaderTitleActive","resetHeaderTitleActive","applyHeaderType","mountHero","hidden","setHeroHidden","resetHeroHidden","applyHero","mountMain","active","setHeaderShadow","resetHeaderShadow","marker$","bottom","active$","watchMain","mountTabs","setTabsHidden","resetTabsHidden","applyTabs","isAppleDevice","navigator","userAgent","fetchSourceFacts","toLowerCase","user","repo","status","stargazers_count","forks_count","public_repos","fetchSourceFactsFromGitHub","project","encodeURIComponent","star_count","fetchSourceFactsFromGitLab","setScrollLock","resetScrollLock","parseInt","initialize","SyntaxError","hash$","features","search$","navigation$","toc$","tabs$","hero$","keyboard$","indexOf","setupKeyboard","els$","details","closest","open","scrollIntoView","patchDetails","src","script","patchScripts","hasAttribute","patchSource","sentinel","patchTables","iif","patchScrollfix","dialog$","duration","dialog","add","body","setupDialog","clipboard$","block","parent","insertBefore","on","clearSelection","setupClipboard","link$","scrollRestoration","state$","push$","pop$","state","debounceTime","replaceState","bufferCount","instant$","sample","head","dispatchEvent","CustomEvent","setupInstantLoading","visibility","values","documentElement","match"],"mappings":"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","file":"assets/javascripts/bundle.bdb82690.min.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t0: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([85,1]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { BehaviorSubject } from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve location\n *\n * This function will return a `URL` object (and not `Location`) in order to\n * normalize typings across the application. Furthermore, locations need to be\n * tracked without setting them and `Location` is a singleton which represents\n * the current location.\n *\n * @return URL\n */\nexport function getLocation(): URL {\n return new URL(location.href)\n}\n\n/**\n * Set location\n *\n * @param url - URL to change to\n */\nexport function setLocation(url: URL): void {\n location.href = url.href\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Check whether a URL is an internal link or a file (except `.html`)\n *\n * @param url - URL or HTML anchor element\n * @param ref - Reference URL\n *\n * @return Test result\n */\nexport function isLocationInternal(\n url: URL | HTMLAnchorElement,\n ref: URL | Location = location\n): boolean {\n return url.host === ref.host\n && /^(?:\\/[\\w-]+)*(?:\\/?|\\.html)$/i.test(url.pathname)\n}\n\n/**\n * Check whether a URL is an anchor link on the current page\n *\n * @param url - URL or HTML anchor element\n * @param ref - Reference URL\n *\n * @return Test result\n */\nexport function isLocationAnchor(\n url: URL | HTMLAnchorElement,\n ref: URL | Location = location\n): boolean {\n return url.pathname === ref.pathname\n && url.hash.length > 0\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch location\n *\n * @return Location subject\n */\nexport function watchLocation(): BehaviorSubject {\n return new BehaviorSubject(getLocation())\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent } from \"rxjs\"\nimport { filter, map, share, startWith } from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve location hash\n *\n * @return Location hash\n */\nexport function getLocationHash(): string {\n return location.hash.substring(1)\n}\n\n/**\n * Set location hash\n *\n * Setting a new fragment identifier via `location.hash` will have no effect\n * if the value doesn't change. However, when a new fragment identifier is set,\n * we want the browser to target the respective element at all times, which is\n * why we use this dirty little trick.\n *\n * @param hash - Location hash\n */\nexport function setLocationHash(hash: string): void {\n const el = document.createElement(\"a\")\n el.href = hash\n el.click()\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch location hash\n *\n * @return Location hash observable\n */\nexport function watchLocationHash(): Observable {\n return fromEvent(window, \"hashchange\")\n .pipe(\n map(getLocationHash),\n startWith(getLocationHash()),\n filter(hash => hash.length > 0),\n share()\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { NEVER, Observable } from \"rxjs\"\nimport { ajax } from \"rxjs/ajax\"\nimport {\n catchError,\n distinctUntilKeyChanged,\n map,\n share,\n skip,\n switchMap\n} from \"rxjs/operators\"\n\nimport { setLocation } from \"../../location\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n location$: Observable /* Location observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch document switch\n *\n * This function returns an observables that fetches a document if the provided\n * location observable emits a new value (i.e. URL). If the emitted URL points\n * to the same page, the request is effectively ignored (i.e. when only the\n * fragment identifier changes).\n *\n * Theoretically, we could use `responseType: \"document\"`, but since all MkDocs\n * links are relative, we need to make sure that the current location matches\n * the document we just loaded. Otherwise any relative links in the document\n * may use the old location.\n *\n * @param options - Options\n *\n * @return Document observable\n */\nexport function watchDocumentSwitch(\n { location$ }: WatchOptions\n): Observable {\n const dom = new DOMParser()\n return location$\n .pipe(\n distinctUntilKeyChanged(\"pathname\"),\n skip(1),\n\n /* Fetch document */\n switchMap(url => ajax({\n url: url.href,\n responseType: \"text\",\n withCredentials: true\n })\n .pipe(\n map(({ response }): Document => {\n history.pushState({}, \"\", url.toString()) // TODO: abstract into function\n return dom.parseFromString(response, \"text/html\")\n }),\n catchError(() => {\n setLocation(url)\n return NEVER\n })\n )\n ),\n share()\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { NEVER, Observable, fromEvent, merge } from \"rxjs\"\nimport { mapTo, shareReplay } from \"rxjs/operators\"\n\nimport { watchDocumentSwitch } from \"../switch\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n location$?: Observable /* Location observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch document\n *\n * If the location observable is passed, instant loading will be enabled which\n * means that new values will be emitted every time the location changes.\n *\n * @return Document observable\n */\nexport function watchDocument(\n { location$ }: WatchOptions = {}\n): Observable {\n return merge(\n fromEvent(document, \"DOMContentLoaded\")\n .pipe(\n mapTo(document)\n ),\n typeof location$ !== \"undefined\"\n ? watchDocumentSwitch({ location$ })\n : NEVER\n )\n .pipe(\n shareReplay(1)\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve an element matching the query selector\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @return Element or nothing\n */\nexport function getElement(\n selector: string, node: ParentNode = document\n): T | undefined {\n return node.querySelector(selector) || undefined\n}\n\n/**\n * Retrieve an element matching a query selector or throw a reference error\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @return Element\n */\nexport function getElementOrThrow(\n selector: string, node: ParentNode = document\n): T {\n const el = getElement(selector, node)\n if (typeof el === \"undefined\")\n throw new ReferenceError(\n `Missing element: expected \"${selector}\" to be present`\n )\n return el\n}\n\n/**\n * Retrieve the currently active element\n *\n * @return Element or nothing\n */\nexport function getActiveElement(): HTMLElement | undefined {\n return document.activeElement instanceof HTMLElement\n ? document.activeElement\n : undefined\n}\n\n/**\n * Retrieve all elements matching the query selector\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @return Elements\n */\nexport function getElements(\n selector: string, node: ParentNode = document\n): T[] {\n return Array.from(node.querySelectorAll(selector))\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent, merge } from \"rxjs\"\nimport { mapTo, shareReplay, startWith } from \"rxjs/operators\"\n\nimport { getActiveElement } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set element focus\n *\n * @param el - Element\n * @param value - Whether the element should be focused\n */\nexport function setElementFocus(\nel: HTMLElement, value: boolean = true\n): void {\n if (value)\n el.focus()\n else\n el.blur()\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element focus\n *\n * @param el - Element\n *\n * @return Element focus observable\n */\nexport function watchElementFocus(\n el: HTMLElement\n): Observable {\n const focus$ = fromEvent(el, \"focus\")\n const blur$ = fromEvent(el, \"blur\")\n\n /* Map events to boolean state */\n return merge(\n focus$.pipe(mapTo(true)),\n blur$.pipe(mapTo(false))\n )\n .pipe(\n startWith(el === getActiveElement()),\n shareReplay(1)\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent, merge } from \"rxjs\"\nimport { map, shareReplay, startWith } from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Element offset\n */\nexport interface ElementOffset {\n x: number /* Horizontal offset */\n y: number /* Vertical offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element offset\n *\n * @param el - Element\n *\n * @return Element offset\n */\nexport function getElementOffset(el: HTMLElement): ElementOffset {\n return {\n x: el.scrollLeft,\n y: el.scrollTop\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element offset\n *\n * @param el - Element\n *\n * @return Element offset observable\n */\nexport function watchElementOffset(\n el: HTMLElement\n): Observable {\n return merge(\n fromEvent(el, \"scroll\"),\n fromEvent(window, \"resize\")\n )\n .pipe(\n map(() => getElementOffset(el)),\n startWith(getElementOffset(el)),\n shareReplay(1)\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set element text selection\n *\n * @param el - Element\n */\nexport function setElementSelection(\n el: HTMLElement\n): void {\n if (el instanceof HTMLInputElement)\n el.select()\n else\n throw new Error(\"Not implemented\")\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport ResizeObserver from \"resize-observer-polyfill\"\nimport { Observable, fromEventPattern } from \"rxjs\"\nimport { shareReplay, startWith } from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Element offset\n */\nexport interface ElementSize {\n width: number /* Element width */\n height: number /* Element height */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element size\n *\n * @param el - Element\n *\n * @return Element size\n */\nexport function getElementSize(el: HTMLElement): ElementSize {\n return {\n width: el.offsetWidth,\n height: el.offsetHeight\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element size\n *\n * @param el - Element\n *\n * @return Element size observable\n */\nexport function watchElementSize(\n el: HTMLElement\n): Observable {\n return fromEventPattern(next => {\n new ResizeObserver(([{ contentRect }]) => next({\n width: Math.round(contentRect.width),\n height: Math.round(contentRect.height)\n }))\n .observe(el)\n })\n .pipe(\n startWith(getElementSize(el)),\n shareReplay(1)\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent } from \"rxjs\"\nimport { filter, map, share } from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Key\n */\nexport interface Key {\n type: string /* Key type */\n claim(): void /* Key claim */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Check whether an element may receive keyboard input\n *\n * @param el - Element\n *\n * @return Test result\n */\nexport function isSusceptibleToKeyboard(el: HTMLElement): boolean {\n switch (el.tagName) {\n\n /* Form elements */\n case \"INPUT\":\n case \"SELECT\":\n case \"TEXTAREA\":\n return true\n\n /* Everything else */\n default:\n return el.isContentEditable\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch keyboard\n *\n * @return Keyboard observable\n */\nexport function watchKeyboard(): Observable {\n return fromEvent(window, \"keydown\")\n .pipe(\n filter(ev => !(ev.metaKey || ev.ctrlKey)),\n map(ev => ({\n type: ev.key,\n claim() {\n ev.preventDefault()\n ev.stopPropagation()\n }\n })),\n share()\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEventPattern } from \"rxjs\"\nimport { shareReplay, startWith } from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch media query\n *\n * @param query - Media query\n *\n * @return Media observable\n */\nexport function watchMedia(query: string): Observable {\n const media = matchMedia(query)\n return fromEventPattern(next =>\n media.addListener(() => next(media.matches))\n )\n .pipe(\n startWith(media.matches),\n shareReplay(1)\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent } from \"rxjs\"\nimport { map, startWith } from \"rxjs/operators\"\n\nimport { getElementOrThrow } from \"../element\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Toggle\n */\nexport type Toggle =\n | \"drawer\" /* Toggle for drawer */\n | \"search\" /* Toggle for search */\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Toggle map\n */\nconst toggles: Record = {\n drawer: getElementOrThrow(`[data-md-toggle=drawer]`),\n search: getElementOrThrow(`[data-md-toggle=search]`)\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve the value of a toggle\n *\n * @param name - Toggle\n *\n * @return Toggle value\n */\nexport function getToggle(name: Toggle): boolean {\n return toggles[name].checked\n}\n\n/**\n * Set toggle\n *\n * Simulating a click event seems to be the most cross-browser compatible way\n * of changing the value while also emitting a `change` event. Before, Material\n * used `CustomEvent` to programmatically change the value of a toggle, but this\n * is a much simpler and cleaner solution which doesn't require a polyfill.\n *\n * @param name - Toggle\n * @param value - Toggle value\n */\nexport function setToggle(name: Toggle, value: boolean): void {\n if (toggles[name].checked !== value)\n toggles[name].click()\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch toggle\n *\n * @param name - Toggle\n *\n * @return Toggle value observable\n */\nexport function watchToggle(name: Toggle): Observable {\n const el = toggles[name]\n return fromEvent(el, \"change\")\n .pipe(\n map(() => el.checked),\n startWith(el.checked)\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent, merge } from \"rxjs\"\nimport { map, startWith } from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Viewport offset\n */\nexport interface ViewportOffset {\n x: number /* Horizontal offset */\n y: number /* Vertical offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve viewport offset\n *\n * On iOS Safari, viewport offset can be negative due to overflow scrolling.\n * As this may induce strange behaviors downstream, we'll just limit it to 0.\n *\n * @return Viewport offset\n */\nexport function getViewportOffset(): ViewportOffset {\n return {\n x: Math.max(0, pageXOffset),\n y: Math.max(0, pageYOffset)\n }\n}\n\n/**\n * Set viewport offset\n *\n * @param offset - Viewport offset\n */\nexport function setViewportOffset(\n { x, y }: Partial\n): void {\n window.scrollTo(x || 0, y || 0)\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport offset\n *\n * @return Viewport offset observable\n */\nexport function watchViewportOffset(): Observable {\n return merge(\n fromEvent(window, \"scroll\"),\n fromEvent(window, \"resize\")\n )\n .pipe(\n map(getViewportOffset),\n startWith(getViewportOffset())\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent } from \"rxjs\"\nimport { map, startWith } from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Viewport size\n */\nexport interface ViewportSize {\n width: number /* Viewport width */\n height: number /* Viewport height */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve viewport size\n *\n * @return Viewport size\n */\nexport function getViewportSize(): ViewportSize {\n return {\n width: innerWidth,\n height: innerHeight\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport size\n *\n * @return Viewport size observable\n */\nexport function watchViewportSize(): Observable {\n return fromEvent(window, \"resize\")\n .pipe(\n map(getViewportSize),\n startWith(getViewportSize())\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, combineLatest } from \"rxjs\"\nimport {\n distinctUntilKeyChanged,\n map,\n shareReplay\n} from \"rxjs/operators\"\n\nimport { Header } from \"components\"\n\nimport {\n ViewportOffset,\n watchViewportOffset\n} from \"../offset\"\nimport {\n ViewportSize,\n watchViewportSize\n} from \"../size\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Viewport\n */\nexport interface Viewport {\n offset: ViewportOffset /* Viewport offset */\n size: ViewportSize /* Viewport size */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch at options\n */\ninterface WatchAtOptions {\n header$: Observable /* Header observable */\n viewport$: Observable /* Viewport observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport\n *\n * @return Viewport observable\n */\nexport function watchViewport(): Observable {\n return combineLatest([\n watchViewportOffset(),\n watchViewportSize()\n ])\n .pipe(\n map(([offset, size]) => ({ offset, size })),\n shareReplay(1)\n )\n}\n\n/**\n * Watch viewport relative to element\n *\n * @param el - Element\n * @param options - Options\n *\n * @return Viewport observable\n */\nexport function watchViewportAt(\n el: HTMLElement, { header$, viewport$ }: WatchAtOptions\n): Observable {\n const offset$ = combineLatest([\n viewport$.pipe(distinctUntilKeyChanged(\"size\")),\n header$\n ])\n .pipe(\n map((): ViewportOffset => ({\n x: el.offsetLeft,\n y: el.offsetTop\n }))\n )\n\n /* Compute relative viewport, return hot observable */\n return combineLatest([header$, viewport$, offset$])\n .pipe(\n map(([{ height }, { offset, size }, { x, y }]) => ({\n offset: {\n x: offset.x - x,\n y: offset.y - y + height\n },\n size\n })),\n shareReplay(1)\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, Subject, fromEventPattern } from \"rxjs\"\nimport {\n pluck,\n share,\n switchMapTo,\n tap,\n throttle\n} from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Worker message\n */\nexport interface WorkerMessage {\n type: unknown /* Message type */\n data: unknown /* Message data */\n}\n\n/**\n * Worker handler\n *\n * @template T - Message type\n */\nexport interface WorkerHandler<\n T extends WorkerMessage\n> {\n tx$: Subject /* Message transmission subject */\n rx$: Observable /* Message receive observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n *\n * @template T - Worker message type\n */\ninterface WatchOptions {\n tx$: Observable /* Message transmission observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch a web worker\n *\n * This function returns an observable that will send all values emitted by the\n * message observable to the web worker. Web worker communication is expected\n * to be bidirectional (request-response) and synchronous. Messages that are\n * emitted during a pending request are throttled, the last one is emitted.\n *\n * @param worker - Web worker\n * @param options - Options\n *\n * @return Worker message observable\n */\nexport function watchWorker(\n worker: Worker, { tx$ }: WatchOptions\n): Observable {\n\n /* Intercept messages from worker-like objects */\n const rx$ = fromEventPattern(next =>\n worker.addEventListener(\"message\", next)\n )\n .pipe(\n pluck(\"data\")\n )\n\n /* Send and receive messages, return hot observable */\n return tx$\n .pipe(\n throttle(() => rx$, { leading: true, trailing: true }),\n tap(message => worker.postMessage(message)),\n switchMapTo(rx$),\n share()\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { SearchIndexConfig, SearchIndexOptions } from \"integrations/search\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Feature flags\n */\nexport type Feature =\n | \"tabs\" /* Tabs navigation */\n | \"instant\" /* Instant loading\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * URL configuration\n */\nexport interface UrlConfig {\n base: string /* Base URL */\n worker: {\n search: string /* Search worker URL */\n }\n}\n\n/**\n * Search configuration\n */\nexport interface SearchConfig {\n index?: Promise\n query?: (value: string) => string\n}\n\n/**\n * Configuration\n */\nexport interface Config {\n url: UrlConfig\n features: Feature[] /* Feature flags */\n search?: SearchConfig\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Ensure that the given value is a valid configuration\n *\n * We could use `jsonschema` or any other schema validation framework, but that\n * would just add more bloat to the bundle, so we'll keep it plain and simple.\n *\n * @param config - Configuration\n *\n * @return Test result\n */\nexport function isConfig(config: any): config is Config {\n return typeof config === \"object\"\n && typeof config.url === \"object\"\n && typeof config.url.base === \"string\"\n && typeof config.url.worker === \"object\"\n && typeof config.url.worker.search === \"string\"\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n// tslint:disable no-null-keyword\n\nimport { JSX as JSXInternal } from \"preact\"\nimport { keys } from \"ramda\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * HTML and SVG attributes\n */\ntype Attributes =\n & JSXInternal.HTMLAttributes\n & JSXInternal.SVGAttributes\n & Record\n\n/**\n * Child element\n */\ntype Child =\n | HTMLElement\n | SVGElement\n | Text\n | string\n | number\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create an element\n *\n * @param tag - HTML or SVG tag\n *\n * @return Element\n */\nfunction createElement(tag: string): HTMLElement | SVGElement {\n switch (tag) {\n\n /* SVG elements */\n case \"svg\":\n case \"path\":\n return document.createElementNS(\"http://www.w3.org/2000/svg\", tag)\n\n /* HTML elements */\n default:\n return document.createElement(tag)\n }\n}\n\n/**\n * Set an attribute\n *\n * @param el - Element\n * @param name - Attribute name\n * @param value - Attribute value\n */\nfunction setAttribute(\n el: HTMLElement | SVGElement, name: string, value: string) {\n switch (name) {\n\n /* Attributes to be ignored */\n case \"xmlns\":\n break\n\n /* Attributes of SVG elements */\n case \"viewBox\":\n case \"d\":\n if (typeof value !== \"boolean\")\n el.setAttributeNS(null, name, value)\n else if (value)\n el.setAttributeNS(null, name, \"\")\n break\n\n /* Attributes of HTML elements */\n default:\n if (typeof value !== \"boolean\")\n el.setAttribute(name, value)\n else if (value)\n el.setAttribute(name, \"\")\n }\n}\n\n/**\n * Append a child node to an element\n *\n * @param el - Element\n * @param child - Child node(s)\n */\nfunction appendChild(\n el: HTMLElement | SVGElement, child: Child | Child[]\n): void {\n\n /* Handle primitive types (including raw HTML) */\n if (typeof child === \"string\" || typeof child === \"number\") {\n el.innerHTML += child.toString()\n\n /* Handle nodes */\n } else if (child instanceof Node) {\n el.appendChild(child)\n\n /* Handle nested children */\n } else if (Array.isArray(child)) {\n for (const node of child)\n appendChild(el, node)\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * JSX factory\n *\n * @param tag - HTML or SVG tag\n * @param attributes - HTML attributes\n * @param children - Child elements\n *\n * @return Element\n */\nexport function h(\n tag: string, attributes: Attributes | null, ...children: Child[]\n): HTMLElement | SVGElement {\n const el = createElement(tag)\n\n /* Set attributes, if any */\n if (attributes)\n for (const attr of keys(attributes))\n setAttribute(el, attr, attributes[attr])\n\n /* Append child nodes */\n for (const child of children)\n appendChild(el, child)\n\n /* Return element */\n return el\n}\n\n/* ----------------------------------------------------------------------------\n * Namespace\n * ------------------------------------------------------------------------- */\n\nexport declare namespace h {\n namespace JSX {\n type Element = HTMLElement | SVGElement\n type IntrinsicElements = JSXInternal.IntrinsicElements\n }\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, defer, of } from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Cache the last value emitted by an observable in session storage\n *\n * If the key is not found in session storage, the factory is executed and the\n * latest value emitted will automatically be persisted to sessions storage.\n * Note that the values emitted by the returned observable must be serializable\n * as `JSON`, or data will be lost.\n *\n * @template T - Value type\n *\n * @param key - Cache key\n * @param factory - Observable factory\n *\n * @return Value observable\n */\nexport function cache(\n key: string, factory: () => Observable\n): Observable {\n return defer(() => {\n const data = sessionStorage.getItem(key)\n if (data) {\n return of(JSON.parse(data) as T)\n\n /* Retrieve value from observable factory and write to storage */\n } else {\n const value$ = factory()\n value$.subscribe(value => {\n try {\n sessionStorage.setItem(key, JSON.stringify(value))\n } catch (err) {\n /* Uncritical, just swallow */\n }\n })\n\n /* Return value */\n return value$\n }\n })\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { getElementOrThrow } from \"browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Translation keys\n */\ntype TranslateKey =\n | \"clipboard.copy\" /* Copy to clipboard */\n | \"clipboard.copied\" /* Copied to clipboard */\n | \"search.config.lang\" /* Search language */\n | \"search.config.pipeline\" /* Search pipeline */\n | \"search.config.separator\" /* Search separator */\n | \"search.result.placeholder\" /* Type to start searching */\n | \"search.result.none\" /* No matching documents */\n | \"search.result.one\" /* 1 matching document */\n | \"search.result.other\" /* # matching documents */\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Translations\n */\nlet lang: Record\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Translate the given key\n *\n * @param key - Key to be translated\n * @param value - Value to be replaced\n *\n * @return Translation\n */\nexport function translate(key: TranslateKey, value?: string): string {\n if (typeof lang === \"undefined\") {\n const el = getElementOrThrow(\"#__lang\")\n lang = JSON.parse(el.textContent!)\n }\n if (typeof lang[key] === \"undefined\") {\n throw new ReferenceError(`Invalid translation: ${key}`)\n }\n return typeof value !== \"undefined\"\n ? lang[key].replace(\"#\", value)\n : lang[key]\n}\n\n/**\n * Truncate a string after the given number of characters\n *\n * This is not a very reasonable approach, since the summaries kind of suck.\n * It would be better to create something more intelligent, highlighting the\n * search occurrences and making a better summary out of it, but this note was\n * written three years ago, so who knows if we'll ever fix it.\n *\n * @param value - Value to be truncated\n * @param n - Number of characters\n *\n * @return Truncated value\n */\nexport function truncate(value: string, n: number): string {\n let i = n\n if (value.length > i) {\n while (value[i] !== \" \" && --i > 0); // tslint:disable-line\n return `${value.substring(0, i)}...`\n }\n return value\n}\n\n/**\n * Round a number for display with source facts\n *\n * This is a reverse engineered version of GitHub's weird rounding algorithm\n * for stars, forks and all other numbers. While all numbers below `1,000` are\n * returned as-is, bigger numbers are converted to fixed numbers:\n *\n * - `1,049` => `1k`\n * - `1,050` => `1.1k`\n * - `1,949` => `1.9k`\n * - `1,950` => `2k`\n *\n * @param value - Original value\n *\n * @return Rounded value\n */\nexport function round(value: number): string {\n if (value > 999) {\n const digits = +((value - 950) % 1000 > 99)\n return `${((value + 1) / 1000).toFixed(digits)}k`\n } else {\n return value.toString()\n }\n}\n\n/**\n * Simple hash function\n *\n * @see https://bit.ly/2wsVjJ4 - Original source\n *\n * @param value - Value to be hashed\n *\n * @return Hash as 32bit integer\n */\nexport function hash(value: string): number {\n let h = 0\n for (let i = 0, len = value.length; i < len; i++) {\n h = ((h << 5) - h) + value.charCodeAt(i)\n h |= 0 // Convert to 32bit integer\n }\n return h\n }\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nexport * from \"./_\"\nexport * from \"./header\"\nexport * from \"./hero\"\nexport * from \"./main\"\nexport * from \"./navigation\"\nexport * from \"./search\"\nexport * from \"./shared\"\nexport * from \"./tabs\"\nexport * from \"./toc\"\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set sidebar offset\n *\n * @param el - Sidebar element\n * @param value - Sidebar offset\n */\nexport function setSidebarOffset(\n el: HTMLElement, value: number\n): void {\n el.style.top = `${value}px`\n}\n\n/**\n * Reset sidebar offset\n *\n * @param el - Sidebar element\n */\nexport function resetSidebarOffset(\n el: HTMLElement\n): void {\n el.style.top = \"\"\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Set sidebar height\n *\n * @param el - Sidebar element\n * @param value - Sidebar height\n */\nexport function setSidebarHeight(\n el: HTMLElement, value: number\n): void {\n el.style.height = `${value}px`\n}\n\n/**\n * Reset sidebar height\n *\n * @param el - Sidebar element\n */\nexport function resetSidebarHeight(\n el: HTMLElement\n): void {\n el.style.height = \"\"\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Set sidebar lock\n *\n * @param el - Sidebar element\n * @param value - Whether the sidebar is locked\n */\nexport function setSidebarLock(\n el: HTMLElement, value: boolean\n): void {\n el.setAttribute(\"data-md-state\", value ? \"lock\" : \"\")\n}\n\n/**\n * Reset sidebar lock\n *\n * @param el - Sidebar element\n */\nexport function resetSidebarLock(\n el: HTMLElement\n): void {\n el.removeAttribute(\"data-md-state\")\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { EMPTY, Observable, of } from \"rxjs\"\nimport {\n distinctUntilChanged,\n map,\n scan,\n shareReplay,\n switchMap\n} from \"rxjs/operators\"\n\nimport { getElement } from \"browser\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Component\n */\nexport type Component =\n | \"container\" /* Container */\n | \"header\" /* Header */\n | \"header-title\" /* Header title */\n | \"hero\" /* Hero */\n | \"main\" /* Main area */\n | \"navigation\" /* Navigation */\n | \"search\" /* Search */\n | \"search-query\" /* Search input */\n | \"search-reset\" /* Search reset */\n | \"search-result\" /* Search results */\n | \"skip\" /* Skip link */\n | \"tabs\" /* Tabs */\n | \"toc\" /* Table of contents */\n\n/**\n * Component map\n */\nexport type ComponentMap = {\n [P in Component]?: HTMLElement\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n document$: Observable /* Document observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Component map observable\n */\nlet components$: Observable\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup bindings to components with given names\n *\n * This function will maintain bindings to the elements identified by the given\n * names in-between document switches and update the elements in-place.\n *\n * @param names - Component names\n * @param options - Options\n */\nexport function setupComponents(\n names: Component[], { document$ }: WatchOptions\n): void {\n components$ = document$\n .pipe(\n\n /* Build component map */\n map(document => names.reduce((components, name) => {\n const el = getElement(`[data-md-component=${name}]`, document)\n return {\n ...components,\n ...typeof el !== \"undefined\" ? { [name]: el } : {}\n }\n }, {})),\n\n /* Re-compute component map on document switch */\n scan((prev, next) => {\n for (const name of names) {\n switch (name) {\n\n /* Top-level components: update */\n case \"header-title\":\n case \"container\":\n case \"skip\":\n if (name in prev && typeof prev[name] !== \"undefined\") {\n prev[name]!.replaceWith(next[name]!)\n prev[name] = next[name]\n }\n break\n\n /* All other components: rebind */\n default:\n if (typeof next[name] !== \"undefined\")\n prev[name] = getElement(`[data-md-component=${name}]`)\n else\n delete prev[name]\n }\n }\n return prev\n }),\n\n /* Convert to hot observable */\n shareReplay(1)\n )\n}\n\n/**\n * Retrieve a component\n *\n * The returned observable will only re-emit if the element changed, i.e. if\n * it was replaced from a document which was switched to.\n *\n * @template T - Element type\n *\n * @param name - Component name\n *\n * @return Element observable\n */\nexport function useComponent(\n name: \"search-query\"\n): Observable\nexport function useComponent(\n name: Component\n): Observable\nexport function useComponent(\n name: Component\n): Observable {\n return components$\n .pipe(\n switchMap(components => (\n typeof components[name] !== \"undefined\"\n ? of(components[name] as T)\n : EMPTY\n )),\n distinctUntilChanged()\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set anchor blur\n *\n * @param el - Anchor element\n * @param value - Whether the anchor is blurred\n */\nexport function setAnchorBlur(\n el: HTMLElement, value: boolean\n): void {\n el.setAttribute(\"data-md-state\", value ? \"blur\" : \"\")\n}\n\n/**\n * Reset anchor blur\n *\n * @param el - Anchor element\n */\nexport function resetAnchorBlur(\n el: HTMLElement\n): void {\n el.removeAttribute(\"data-md-state\")\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Set anchor active\n *\n * @param el - Anchor element\n * @param value - Whether the anchor is active\n */\nexport function setAnchorActive(\n el: HTMLElement, value: boolean\n): void {\n el.classList.toggle(\"md-nav__link--active\", value)\n}\n\n/**\n * Reset anchor active\n *\n * @param el - Anchor element\n */\nexport function resetAnchorActive(\n el: HTMLElement\n): void {\n el.classList.remove(\"md-nav__link--active\")\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nexport * from \"./sidebar\"\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { h, translate } from \"utilities\"\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * CSS classes\n */\nconst css = {\n container: \"md-clipboard md-icon\"\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Path of `file-search-outline` icon\n */\nconst path =\n \"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 \" +\n \"21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a 'copy-to-clipboard' button\n *\n * @param id - Unique identifier\n *\n * @return Element\n */\nexport function renderClipboard(\n id: string\n) {\n return (\n \n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { SearchResult } from \"integrations/search\"\nimport { h, truncate } from \"utilities\"\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * CSS classes\n */\nconst css = {\n item: \"md-search-result__item\",\n link: \"md-search-result__link\",\n article: \"md-search-result__article md-search-result__article--document\",\n section: \"md-search-result__article\",\n title: \"md-search-result__title\",\n teaser: \"md-search-result__teaser\"\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Path of `content-copy` icon\n */\nconst path =\n \"M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H13C12.59,21.75 12.2,21.44 \" +\n \"11.86,21.1C11.53,20.77 11.25,20.4 11,20H6V4H13V9H18V10.18C18.71,10.34 \" +\n \"19.39,10.61 20,11V8L14,2M20.31,18.9C21.64,16.79 21,14 \" +\n \"18.91,12.68C16.8,11.35 14,12 12.69,14.08C11.35,16.19 12,18.97 \" +\n \"14.09,20.3C15.55,21.23 17.41,21.23 \" +\n \"18.88,20.32L22,23.39L23.39,22L20.31,18.9M16.5,19A2.5,2.5 0 0,1 \" +\n \"14,16.5A2.5,2.5 0 0,1 16.5,14A2.5,2.5 0 0,1 19,16.5A2.5,2.5 0 0,1 16.5,19Z\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a search result\n *\n * @param result - Search result\n *\n * @return Element\n */\nexport function renderSearchResult(\n { article, sections }: SearchResult\n) {\n\n /* Render icon */\n const icon = (\n
\n \n
\n )\n\n /* Render article and sections */\n const children = [article, ...sections].map(document => {\n const { location, title, text } = document\n return (\n \n \n {!(\"parent\" in document) && icon}\n
\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { SourceFacts } from \"patches/source\"\nimport { h } from \"utilities\"\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * CSS classes\n */\nconst css = {\n facts: \"md-source__facts\",\n fact: \"md-source__fact\"\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render source facts\n *\n * @param facts - Source facts\n *\n * @return Element\n */\nexport function renderSource(\n facts: SourceFacts\n) {\n const children = facts.map(fact => (\n
{fact}
\n ))\n return (\n
\n {children}\n
\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { h } from \"utilities\"\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * CSS classes\n */\nconst css = {\n wrapper: \"md-typeset__scrollwrap\",\n table: \"md-typeset__table\"\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a table inside a wrapper to improve scrolling on mobile\n *\n * @param table - Table element\n *\n * @return Element\n */\nexport function renderTable(\n table: HTMLTableElement\n) {\n return (\n
\n
\n {table}\n
\n
\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Global augmentations\n */\ndeclare global {\n interface CSSStyleDeclaration {\n webkitOverflowScrolling: \"touch\" | \"\"\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set overflow scrolling\n *\n * @param el - Scrollable element\n */\nexport function setOverflowScrolling(\n el: HTMLElement\n): void {\n el.style.webkitOverflowScrolling = \"touch\"\n}\n\n/**\n * Reset overflow scrolling\n *\n * @param el - Scrollable element\n */\nexport function resetOverflowScrolling(\n el: HTMLElement\n): void {\n el.style.webkitOverflowScrolling = \"\"\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A RTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { SearchIndexOptions, SearchResult } from \"integrations/search\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search message type\n */\nexport const enum SearchMessageType {\n SETUP, /* Search index setup */\n DUMP, /* Search index dump */\n QUERY, /* Search query */\n RESULT /* Search results */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * A message containing the data necessary to setup the search index\n */\nexport interface SearchSetupMessage {\n type: SearchMessageType.SETUP /* Message type */\n data: SearchIndexOptions /* Message data */\n}\n\n/**\n * A message containing the a dump of the search index\n */\nexport interface SearchDumpMessage {\n type: SearchMessageType.DUMP /* Message type */\n data: string /* Message data */\n}\n\n/**\n * A message containing a search query\n */\nexport interface SearchQueryMessage {\n type: SearchMessageType.QUERY /* Message type */\n data: string /* Message data */\n}\n\n/**\n * A message containing results for a search query\n */\nexport interface SearchResultMessage {\n type: SearchMessageType.RESULT /* Message type */\n data: SearchResult[] /* Message data */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * A message exchanged with the search worker\n */\nexport type SearchMessage =\n | SearchSetupMessage\n | SearchDumpMessage\n | SearchQueryMessage\n | SearchResultMessage\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Type guard for search setup messages\n *\n * @param message - Search worker message\n *\n * @return Test result\n */\nexport function isSearchSetupMessage(\n message: SearchMessage\n): message is SearchSetupMessage {\n return message.type === SearchMessageType.SETUP\n}\n\n/**\n * Type guard for search dump messages\n *\n * @param message - Search worker message\n *\n * @return Test result\n */\nexport function isSearchDumpMessage(\n message: SearchMessage\n): message is SearchDumpMessage {\n return message.type === SearchMessageType.DUMP\n}\n\n/**\n * Type guard for search query messages\n *\n * @param message - Search worker message\n *\n * @return Test result\n */\nexport function isSearchQueryMessage(\n message: SearchMessage\n): message is SearchQueryMessage {\n return message.type === SearchMessageType.QUERY\n}\n\n/**\n * Type guard for search result messages\n *\n * @param message - Search worker message\n *\n * @return Test result\n */\nexport function isSearchResultMessage(\n message: SearchMessage\n): message is SearchResultMessage {\n return message.type === SearchMessageType.RESULT\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A RTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, Subject, asyncScheduler, from } from \"rxjs\"\nimport { ajax } from \"rxjs/ajax\"\nimport {\n map,\n observeOn,\n pluck,\n shareReplay,\n switchMap,\n take,\n withLatestFrom\n} from \"rxjs/operators\"\n\nimport { WorkerHandler, watchWorker } from \"browser\"\nimport { SearchIndexConfig, SearchIndexOptions } from \"integrations/search\"\n\nimport { translate } from \"utilities\"\nimport {\n SearchMessage,\n SearchMessageType,\n SearchSetupMessage,\n isSearchResultMessage\n} from \"../message\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup options\n */\ninterface SetupOptions {\n base: string /* Base url */\n index?: Promise /* Promise resolving with index */\n location$: Observable /* Location observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup search web worker\n *\n * This function will create a web worker to setup and query the search index\n * which is done using `lunr`. The index can be passed explicitly in order to\n * enable hacks like _localsearch_ via search index embedding as JSON. If no\n * index is given, this function will load it from the default location.\n *\n * @param url - Worker url\n * @param options - Options\n *\n * @return Worker handler\n */\nexport function setupSearchWorker(\n url: string, { base, index, location$ }: SetupOptions\n): WorkerHandler {\n const worker = new Worker(url)\n\n /* Ensure stable base URL */\n const origin$ = location$\n .pipe(\n take(1),\n map(({ href }) => new URL(base, href)\n .toString()\n .replace(/\\/$/, \"\")\n )\n )\n\n /* Create communication channels and resolve relative links */\n const tx$ = new Subject()\n const rx$ = watchWorker(worker, { tx$ })\n .pipe(\n withLatestFrom(origin$),\n map(([message, origin]) => {\n if (isSearchResultMessage(message)) {\n for (const { article, sections } of message.data) {\n article.location = `${origin}/${article.location}`\n for (const section of sections)\n section.location = `${origin}/${section.location}`\n }\n }\n return message\n }),\n shareReplay(1)\n )\n\n /* Fetch index if it wasn't passed explicitly */\n const index$ = typeof index !== \"undefined\"\n ? from(index)\n : origin$\n .pipe(\n switchMap(origin => ajax({\n url: `${origin}/search/search_index.json`,\n responseType: \"json\",\n withCredentials: true\n })\n .pipe(\n pluck(\"response\")\n )\n )\n )\n\n function isConfigDefaultLang(config: SearchIndexConfig) {\n return config.lang.length === 1 && config.lang[0] === \"en\"\n }\n\n function isConfigDefaultSeparator(config: SearchIndexConfig) {\n return config.separator === \"[\\s\\-]+\"\n }\n\n index$\n .pipe(\n map(({ config, ...rest }) => ({\n config: {\n lang: isConfigDefaultLang(config)\n ? [translate(\"search.config.lang\")]\n : config.lang,\n separator: isConfigDefaultSeparator(config)\n ? translate(\"search.config.separator\")\n : config.separator\n },\n pipeline: translate(\"search.config.pipeline\")\n .split(/\\s*,\\s*/)\n .filter(Boolean) as any, // Hack\n ...rest\n }))\n )\n // .subscribe(console.log)\n\n // /* Send index to worker */\n // index$\n .pipe(\n map((data): SearchSetupMessage => ({\n type: SearchMessageType.SETUP,\n data\n })),\n observeOn(asyncScheduler) // make sure it runs on the next tick\n )\n .subscribe(tx$.next.bind(tx$))\n\n /* Return worker handler */\n return { tx$, rx$ }\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nexport * from \"./_\"\nexport * from \"./react\"\nexport * from \"./set\"\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nexport * from \"./_\"\nexport * from \"./react\"\nexport * from \"./set\"\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nexport * from \"./_\"\nexport * from \"./layer\"\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, OperatorFunction, pipe } from \"rxjs\"\nimport { map, switchMap } from \"rxjs/operators\"\n\nimport { Viewport, getElements } from \"browser\"\n\nimport { Header } from \"../../header\"\nimport { Main } from \"../../main\"\nimport {\n Sidebar,\n applySidebar,\n watchSidebar\n} from \"../../shared\"\nimport {\n NavigationLayer,\n applyNavigationLayer,\n watchNavigationLayer\n} from \"../layer\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Navigation for [screen -]\n */\ninterface NavigationBelowScreen {\n layer: NavigationLayer /* Active layer */\n}\n\n/**\n * Navigation for [screen +]\n */\ninterface NavigationAboveScreen {\n sidebar: Sidebar /* Sidebar */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Navigation\n */\nexport type Navigation =\n | NavigationBelowScreen\n | NavigationAboveScreen\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n header$: Observable /* Header observable */\n main$: Observable /* Main area observable */\n viewport$: Observable /* Viewport observable */\n screen$: Observable /* Screen media observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount navigation from source observable\n *\n * @param options - Options\n *\n * @return Operator function\n */\nexport function mountNavigation(\n { header$, main$, viewport$, screen$ }: MountOptions\n): OperatorFunction {\n return pipe(\n switchMap(el => screen$\n .pipe(\n switchMap(screen => {\n\n /* [screen +]: Mount navigation in sidebar */\n if (screen) {\n return watchSidebar(el, { main$, viewport$ })\n .pipe(\n applySidebar(el, { header$ }),\n map(sidebar => ({ sidebar }))\n )\n\n /* [screen -]: Mount navigation in drawer */\n } else {\n const els = getElements(\"nav\", el)\n return watchNavigationLayer(els)\n .pipe(\n applyNavigationLayer(els),\n map(layer => ({ layer }))\n )\n }\n })\n )\n )\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nexport * from \"./_\"\nexport * from \"./react\"\nexport * from \"./set\"\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n MonoTypeOperatorFunction,\n Observable,\n animationFrameScheduler,\n combineLatest,\n pipe\n} from \"rxjs\"\nimport {\n distinctUntilChanged,\n finalize,\n map,\n observeOn,\n tap,\n withLatestFrom\n} from \"rxjs/operators\"\n\nimport { Viewport } from \"browser\"\n\nimport { Header } from \"../../../header\"\nimport { Main } from \"../../../main\"\nimport { Sidebar } from \"../_\"\nimport {\n resetSidebarHeight,\n resetSidebarLock,\n resetSidebarOffset,\n setSidebarHeight,\n setSidebarLock,\n setSidebarOffset\n} from \"../set\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n main$: Observable /* Main area observable */\n viewport$: Observable /* Viewport observable */\n}\n\n/**\n * Apply options\n */\ninterface ApplyOptions {\n header$: Observable /* Header observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch sidebar\n *\n * This function returns an observable that computes the visual parameters of\n * the sidebar which depends on the vertical viewport offset, as well as the\n * height of the main area. When the page is scrolled beyond the header, the\n * sidebar is locked and fills the remaining space.\n *\n * @param el - Sidebar element\n * @param options - Options\n *\n * @return Sidebar observable\n */\nexport function watchSidebar(\n el: HTMLElement, { main$, viewport$ }: WatchOptions\n): Observable {\n const adjust = el.parentElement!.offsetTop\n - el.parentElement!.parentElement!.offsetTop\n\n /* Compute the sidebar's available height */\n const height$ = combineLatest([main$, viewport$])\n .pipe(\n map(([{ offset, height }, { offset: { y } }]) => (\n height\n + Math.min(adjust, Math.max(0, y - offset))\n - adjust\n )),\n distinctUntilChanged()\n )\n\n /* Compute whether the sidebar should be locked */\n const lock$ = combineLatest([main$, viewport$])\n .pipe(\n map(([{ offset }, { offset: { y } }]) => y >= offset + adjust),\n distinctUntilChanged()\n )\n\n /* Combine into single observable */\n return combineLatest([height$, lock$])\n .pipe(\n map(([height, lock]) => ({ height, lock }))\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Apply sidebar\n *\n * @param el - Sidebar element\n * @param options - Options\n *\n * @return Operator function\n */\nexport function applySidebar(\n el: HTMLElement, { header$ }: ApplyOptions\n): MonoTypeOperatorFunction {\n return pipe(\n\n /* Defer repaint to next animation frame */\n observeOn(animationFrameScheduler),\n withLatestFrom(header$),\n tap(([{ height, lock }, { height: offset }]) => {\n setSidebarHeight(el, height)\n setSidebarLock(el, lock)\n\n /* Set offset in locked state depending on header height */\n if (lock)\n setSidebarOffset(el, offset)\n else\n resetSidebarOffset(el)\n }),\n\n /* Re-map to sidebar */\n map(([sidebar]) => sidebar),\n\n /* Reset on complete or error */\n finalize(() => {\n resetSidebarOffset(el)\n resetSidebarHeight(el)\n resetSidebarLock(el)\n })\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { findLast } from \"ramda\"\nimport {\n MonoTypeOperatorFunction,\n Observable,\n animationFrameScheduler,\n fromEvent,\n merge,\n pipe\n} from \"rxjs\"\nimport {\n delay,\n finalize,\n map,\n observeOn,\n scan,\n tap\n} from \"rxjs/operators\"\n\nimport { getElement, getElementOrThrow } from \"browser\"\n\nimport { NavigationLayer } from \"../_\"\nimport {\n resetOverflowScrolling,\n setOverflowScrolling\n} from \"../set\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch navigation layer\n *\n * On iOS we want to add `-webkit-overflow-scrolling: touch` for the menus\n * contained in the drawer, but as the navigational layers are nested, we can\n * only add it to the topmost layer or extremely weird cropping will occur.\n * This implementation keeps track of the previous and current layer.\n *\n * @param els - Navigation elements\n *\n * @return Navigation layer observable\n */\nexport function watchNavigationLayer(\n els: HTMLElement[]\n): Observable {\n const table = new Map()\n for (const el of els) {\n const label = getElement(\"label\", el)\n if (typeof label !== \"undefined\") {\n const input = getElementOrThrow(`#${label.htmlFor}`)\n table.set(input, el)\n }\n }\n\n /* Determine topmost layer */\n const layer$ = merge(...[...table.keys()].map(input => (\n fromEvent(input, \"change\")\n )))\n .pipe(\n map(() => getElementOrThrow(\".md-nav__list\", table.get(\n findLast(({ checked }) => checked, [...table.keys()])!\n )))\n )\n\n /* Return previous and next layer */\n return layer$\n .pipe(\n map(next => ({ next })),\n scan(({ next: prev }, { next }) => ({ prev, next }))\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Apply navigation layer\n *\n * @param els - Navigation elements\n *\n * @return Operator function\n */\nexport function applyNavigationLayer(\n els: HTMLElement[]\n): MonoTypeOperatorFunction {\n return pipe(\n\n /* Defer repaint to next animation frame */\n observeOn(animationFrameScheduler),\n tap(({ prev }) => {\n if (prev)\n resetOverflowScrolling(prev)\n }),\n\n /* Wait until transition has finished */\n delay(250),\n\n /* Defer repaint to next animation frame */\n observeOn(animationFrameScheduler),\n tap(({ next }) => {\n setOverflowScrolling(next)\n }),\n\n /* Reset on complete or error */\n finalize(() => {\n for (const el of els)\n resetOverflowScrolling(\n getElementOrThrow(\".md-nav__list\", el)\n )\n })\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nexport * from \"./_\"\nexport * from \"./anchor\"\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n OperatorFunction,\n combineLatest,\n of,\n pipe\n} from \"rxjs\"\nimport { map, switchMap } from \"rxjs/operators\"\n\nimport { Viewport, getElements } from \"browser\"\n\nimport { Header } from \"../../header\"\nimport { Main } from \"../../main\"\nimport {\n Sidebar,\n applySidebar,\n watchSidebar\n} from \"../../shared\"\nimport {\n AnchorList,\n applyAnchorList,\n watchAnchorList\n} from \"../anchor\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Table of contents for [tablet -]\n */\ninterface TableOfContentsBelowTablet {} // tslint:disable-line\n\n/**\n * Table of contents for [tablet +]\n */\ninterface TableOfContentsAboveTablet {\n sidebar: Sidebar /* Sidebar */\n anchors: AnchorList /* Anchor list */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Table of contents\n */\nexport type TableOfContents =\n | TableOfContentsBelowTablet\n | TableOfContentsAboveTablet\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n header$: Observable /* Header observable */\n main$: Observable /* Main area observable */\n viewport$: Observable /* Viewport observable */\n tablet$: Observable /* Tablet media observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount table of contents from source observable\n *\n * @param options - Options\n *\n * @return Operator function\n */\nexport function mountTableOfContents(\n { header$, main$, viewport$, tablet$}: MountOptions\n): OperatorFunction {\n return pipe(\n switchMap(el => tablet$\n .pipe(\n switchMap(tablet => {\n\n /* [tablet +]: Mount table of contents in sidebar */\n if (tablet) {\n const els = getElements(\".md-nav__link\", el)\n\n /* Watch and apply sidebar */\n const sidebar$ = watchSidebar(el, { main$, viewport$ })\n .pipe(\n applySidebar(el, { header$ })\n )\n\n /* Watch and apply anchor list (scroll spy) */\n const anchors$ = watchAnchorList(els, { header$, viewport$ })\n .pipe(\n applyAnchorList(els)\n )\n\n /* Combine into a single hot observable */\n return combineLatest([sidebar$, anchors$])\n .pipe(\n map(([sidebar, anchors]) => ({ sidebar, anchors }))\n )\n\n /* [tablet -]: Unmount table of contents */\n } else {\n return of({})\n }\n })\n )\n )\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { reverse } from \"ramda\"\nimport {\n MonoTypeOperatorFunction,\n Observable,\n animationFrameScheduler,\n combineLatest,\n pipe\n} from \"rxjs\"\nimport {\n bufferCount,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n finalize,\n map,\n observeOn,\n scan,\n startWith,\n switchMap,\n tap\n} from \"rxjs/operators\"\n\nimport { Viewport, getElement } from \"browser\"\n\nimport { Header } from \"../../../header\"\nimport { AnchorList } from \"../_\"\nimport {\n resetAnchorActive,\n resetAnchorBlur,\n setAnchorActive,\n setAnchorBlur\n} from \"../set\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n header$: Observable /* Header observable */\n viewport$: Observable /* Viewport observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch anchor list\n *\n * This is effectively a scroll-spy implementation which will account for the\n * fixed header and automatically re-calculate anchor offsets when the viewport\n * is resized. The returned observable will only emit if the anchor list needs\n * to be repainted.\n *\n * This implementation tracks an anchor element's entire path starting from its\n * level up to the top-most anchor element, e.g. `[h3, h2, h1]`. Although the\n * Material theme currently doesn't make use of this information, it enables\n * the styling of the entire hierarchy through customization.\n *\n * Note that the current anchor is the last item of the `prev` anchor list.\n *\n * @param els - Anchor elements\n * @param options - Options\n *\n * @return Anchor list observable\n */\nexport function watchAnchorList(\n els: HTMLAnchorElement[], { header$, viewport$ }: WatchOptions\n): Observable {\n const table = new Map()\n for (const el of els) {\n const id = decodeURIComponent(el.hash.substring(1))\n const target = getElement(`[id=\"${id}\"]`)\n if (typeof target !== \"undefined\")\n table.set(el, target)\n }\n\n /* Compute necessary adjustment for header */\n const adjust$ = header$\n .pipe(\n map(header => 18 + header.height)\n )\n\n /* Compute partition of previous and next anchors */\n const partition$ = viewport$\n .pipe(\n distinctUntilKeyChanged(\"size\"),\n\n /* Build index to map anchor paths to vertical offsets */\n map(() => {\n let path: HTMLAnchorElement[] = []\n return [...table].reduce((index, [anchor, target]) => {\n while (path.length) {\n const last = table.get(path[path.length - 1])!\n if (last.tagName >= target.tagName) {\n path.pop()\n } else {\n break\n }\n }\n\n /* If the current anchor is hidden, continue with its parent */\n let offset = target.offsetTop\n while (!offset && target.parentElement) {\n target = target.parentElement\n offset = target.offsetTop\n }\n\n /* Map reversed anchor path to vertical offset */\n return index.set(\n reverse(path = [...path, anchor]),\n offset\n )\n }, new Map())\n }),\n\n /* Re-compute partition when viewport offset changes */\n switchMap(index => combineLatest([adjust$, viewport$])\n .pipe(\n scan(([prev, next], [adjust, { offset: { y } }]) => {\n\n /* Look forward */\n while (next.length) {\n const [, offset] = next[0]\n if (offset - adjust < y) {\n prev = [...prev, next.shift()!]\n } else {\n break\n }\n }\n\n /* Look backward */\n while (prev.length) {\n const [, offset] = prev[prev.length - 1]\n if (offset - adjust >= y) {\n next = [prev.pop()!, ...next]\n } else {\n break\n }\n }\n\n /* Return partition */\n return [prev, next]\n }, [[], [...index]]),\n distinctUntilChanged((a, b) => {\n return a[0] === b[0]\n && a[1] === b[1]\n })\n )\n )\n )\n\n /* Compute and return anchor list migrations */\n return partition$\n .pipe(\n map(([prev, next]) => ({\n prev: prev.map(([path]) => path),\n next: next.map(([path]) => path)\n })),\n\n /* Extract anchor list migrations */\n startWith({ prev: [], next: [] }),\n bufferCount(2, 1),\n map(([a, b]) => {\n\n /* Moving down */\n if (a.prev.length < b.prev.length) {\n return {\n prev: b.prev.slice(Math.max(0, a.prev.length - 1), b.prev.length),\n next: []\n }\n\n /* Moving up */\n } else {\n return {\n prev: b.prev.slice(-1),\n next: b.next.slice(0, b.next.length - a.next.length)\n }\n }\n })\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Apply anchor list\n *\n * @param els - Anchor elements\n *\n * @return Operator function\n */\nexport function applyAnchorList(\n els: HTMLAnchorElement[]\n): MonoTypeOperatorFunction {\n return pipe(\n\n /* Defer repaint to next animation frame */\n observeOn(animationFrameScheduler),\n tap(({ prev, next }) => {\n\n /* Look forward */\n for (const [el] of next) {\n resetAnchorActive(el)\n resetAnchorBlur(el)\n }\n\n /* Look backward */\n prev.forEach(([el], index) => {\n setAnchorActive(el, index === prev.length - 1)\n setAnchorBlur(el, true)\n })\n }),\n\n /* Reset on complete or error */\n finalize(() => {\n for (const el of els) {\n resetAnchorActive(el)\n resetAnchorBlur(el)\n }\n })\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, OperatorFunction, combineLatest, pipe } from \"rxjs\"\nimport { map, switchMap } from \"rxjs/operators\"\n\nimport { SearchResult } from \"integrations/search\"\n\nimport { SearchQuery } from \"../query\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search\n */\nexport interface Search {\n query: SearchQuery /* Search query */\n result: SearchResult[] /* Search result list */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n query$: Observable /* Search query observable */\n reset$: Observable /* Search reset observable */\n result$: Observable /* Search result observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search from source observable\n *\n * @param options - Options\n *\n * @return Operator function\n */\nexport function mountSearch(\n { query$, reset$, result$ }: MountOptions\n): OperatorFunction {\n return pipe(\n switchMap(() => combineLatest([query$, result$, reset$])\n .pipe(\n map(([query, result]) => ({ query, result }))\n )\n )\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, combineLatest, fromEvent, merge } from \"rxjs\"\nimport {\n delay,\n distinctUntilChanged,\n map,\n startWith\n} from \"rxjs/operators\"\n\nimport { watchElementFocus } from \"browser\"\n\nimport { SearchQuery } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n transform?(value: string): string /* Transformation function */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Default transformation function\n *\n * Rogue control characters are filtered before handing the query to the\n * search index, as `lunr` will throw otherwise.\n *\n * @param value - Query value\n *\n * @return Transformed query value\n */\nfunction defaultTransform(value: string): string {\n return value\n .replace(/(?:^|\\s+)[*+-:^~]+(?=\\s+|$)/g, \"\")\n .trim()\n .replace(/\\s+|\\b$/g, \"* \")\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch search query\n *\n * Note that the focus event which triggers re-reading the current query value\n * is delayed by `1ms` so the input's empty state is allowed to propagate.\n *\n * @param el - Search query element\n * @param options - Options\n *\n * @return Search query observable\n */\nexport function watchSearchQuery(\n el: HTMLInputElement, { transform }: WatchOptions = {}\n): Observable {\n const fn = transform || defaultTransform\n\n /* Intercept keyboard events */\n const value$ = merge(\n fromEvent(el, \"keyup\"),\n fromEvent(el, \"focus\").pipe(delay(1))\n )\n .pipe(\n map(() => fn(el.value)),\n startWith(fn(el.value)),\n distinctUntilChanged()\n )\n\n /* Intercept focus events */\n const focus$ = watchElementFocus(el)\n\n /* Combine into a single observable */\n return combineLatest([value$, focus$])\n .pipe(\n map(([value, focus]) => ({ value, focus }))\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { OperatorFunction, pipe } from \"rxjs\"\nimport {\n distinctUntilKeyChanged,\n map,\n switchMap\n} from \"rxjs/operators\"\n\nimport { WorkerHandler, setToggle } from \"browser\"\nimport {\n SearchMessage,\n SearchMessageType,\n SearchQueryMessage\n} from \"workers\"\n\nimport { watchSearchQuery } from \"../react\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search query\n */\nexport interface SearchQuery {\n value: string /* Query value */\n focus: boolean /* Query focus */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n transform?(value: string): string /* Transformation function */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search query from source observable\n *\n * @param handler - Worker handler\n * @param options - Options\n *\n * @return Operator function\n */\nexport function mountSearchQuery(\n { tx$ }: WorkerHandler, options: MountOptions = {}\n): OperatorFunction {\n return pipe(\n switchMap(el => {\n const query$ = watchSearchQuery(el, options)\n\n /* Subscribe worker to search query */\n query$\n .pipe(\n distinctUntilKeyChanged(\"value\"),\n map(({ value }): SearchQueryMessage => ({\n type: SearchMessageType.QUERY,\n data: value\n }))\n )\n .subscribe(tx$.next.bind(tx$))\n\n /* Toggle search on focus */\n query$\n .pipe(\n distinctUntilKeyChanged(\"focus\")\n )\n .subscribe(({ focus }) => {\n if (focus)\n setToggle(\"search\", focus)\n })\n\n /* Return search query */\n return query$\n })\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { OperatorFunction, pipe } from \"rxjs\"\nimport {\n mapTo,\n startWith,\n switchMap,\n switchMapTo,\n tap\n} from \"rxjs/operators\"\n\nimport { setElementFocus } from \"browser\"\n\nimport { useComponent } from \"../../../_\"\nimport { watchSearchReset } from \"../react\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search reset from source observable\n *\n * @return Operator function\n */\nexport function mountSearchReset(): OperatorFunction {\n return pipe(\n switchMap(el => watchSearchReset(el)\n .pipe(\n switchMapTo(useComponent(\"search-query\")),\n tap(setElementFocus),\n mapTo(undefined)\n )\n ),\n startWith(undefined)\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent } from \"rxjs\"\nimport { mapTo } from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch search reset\n *\n * @param el - Search reset element\n *\n * @return Search reset observable\n */\nexport function watchSearchReset(\n el: HTMLElement\n): Observable {\n return fromEvent(el, \"click\")\n .pipe(\n mapTo(undefined)\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { translate } from \"utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set number of search results\n *\n * @param el - Search result metadata element\n * @param value - Number of results\n */\nexport function setSearchResultMeta(\n el: HTMLElement, value: number\n): void {\n switch (value) {\n\n /* No results */\n case 0:\n el.textContent = translate(\"search.result.none\")\n break\n\n /* One result */\n case 1:\n el.textContent = translate(\"search.result.one\")\n break\n\n /* Multiple result */\n default:\n el.textContent = translate(\"search.result.other\", value.toString())\n }\n}\n\n/**\n * Reset number of search results\n *\n * @param el - Search result metadata element\n */\nexport function resetSearchResultMeta(\n el: HTMLElement\n): void {\n el.textContent = translate(\"search.result.placeholder\")\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Add an element to the search result list\n *\n * @param el - Search result list element\n * @param child - Search result element\n */\nexport function addToSearchResultList(\n el: HTMLElement, child: HTMLElement\n): void {\n el.appendChild(child)\n}\n\n/**\n * Reset search result list\n *\n * @param el - Search result list element\n */\nexport function resetSearchResultList(\n el: HTMLElement\n): void {\n el.innerHTML = \"\"\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n MonoTypeOperatorFunction,\n Observable,\n animationFrameScheduler,\n pipe\n} from \"rxjs\"\nimport {\n finalize,\n map,\n mapTo,\n observeOn,\n scan,\n switchMap,\n withLatestFrom\n} from \"rxjs/operators\"\n\nimport { getElementOrThrow } from \"browser\"\nimport { SearchResult } from \"integrations/search\"\nimport { renderSearchResult } from \"templates\"\n\nimport { SearchQuery } from \"../../query\"\nimport {\n addToSearchResultList,\n resetSearchResultList,\n resetSearchResultMeta,\n setSearchResultMeta\n} from \"../set\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Apply options\n */\ninterface ApplyOptions {\n query$: Observable /* Search query observable */\n fetch$: Observable /* Result fetch observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Apply search results\n *\n * This function will perform a lazy rendering of the search results, depending\n * on the vertical offset of the search result container. When the scroll offset\n * reaches the bottom of the element, more results are fetched and rendered.\n *\n * @param el - Search result element\n * @param options - Options\n *\n * @return Operator function\n */\nexport function applySearchResult(\n el: HTMLElement, { query$, fetch$ }: ApplyOptions\n): MonoTypeOperatorFunction {\n const list = getElementOrThrow(\".md-search-result__list\", el)\n const meta = getElementOrThrow(\".md-search-result__meta\", el)\n return pipe(\n\n /* Apply search result metadata */\n withLatestFrom(query$),\n map(([result, query]) => {\n if (query.value) {\n setSearchResultMeta(meta, result.length)\n } else {\n resetSearchResultMeta(meta)\n }\n return result\n }),\n\n /* Apply search result list */\n switchMap(result => fetch$\n .pipe(\n\n /* Defer repaint to next animation frame */\n observeOn(animationFrameScheduler),\n scan(index => {\n const container = el.parentElement!\n while (index < result.length) {\n addToSearchResultList(list, renderSearchResult(result[index++]))\n if (container.scrollHeight - container.offsetHeight > 16)\n break\n }\n return index\n }, 0),\n\n /* Re-map to search result */\n mapTo(result),\n\n /* Reset on complete or error */\n finalize(() => {\n resetSearchResultList(list)\n })\n )\n )\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { identity } from \"ramda\"\nimport { Observable, OperatorFunction, pipe } from \"rxjs\"\nimport {\n distinctUntilChanged,\n filter,\n map,\n pluck,\n switchMap\n} from \"rxjs/operators\"\n\nimport { WorkerHandler, watchElementOffset } from \"browser\"\nimport { SearchResult } from \"integrations/search\"\nimport {\n SearchMessage,\n isSearchResultMessage\n} from \"workers\"\n\nimport { SearchQuery } from \"../../query\"\nimport { applySearchResult } from \"../react\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n query$: Observable /* Search query observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search result from source observable\n *\n * @param handler - Worker handler\n * @param options - Options\n *\n * @return Operator function\n */\nexport function mountSearchResult(\n { rx$ }: WorkerHandler, { query$ }: MountOptions\n): OperatorFunction {\n return pipe(\n switchMap(el => {\n const container = el.parentElement!\n\n /* Compute whether there are more search results to fetch */\n const fetch$ = watchElementOffset(container)\n .pipe(\n map(({ y }) => {\n return y >= container.scrollHeight - container.offsetHeight - 16\n }),\n distinctUntilChanged(),\n filter(identity)\n )\n\n /* Apply search results */\n return rx$\n .pipe(\n filter(isSearchResultMessage),\n pluck(\"data\"),\n applySearchResult(el, { query$, fetch$ })\n )\n })\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, OperatorFunction, combineLatest, pipe } from \"rxjs\"\nimport {\n distinctUntilChanged,\n filter,\n map,\n shareReplay,\n startWith,\n switchMap,\n withLatestFrom\n} from \"rxjs/operators\"\n\nimport {\n Viewport,\n getElement,\n watchViewportAt\n} from \"browser\"\n\nimport { useComponent } from \"../../_\"\nimport {\n applyHeaderType,\n watchHeader\n} from \"../react\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Header type\n */\nexport type HeaderType =\n | \"site\" /* Header shows site title */\n | \"page\" /* Header shows page title */\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Header\n */\nexport interface Header {\n type: HeaderType /* Header type */\n sticky: boolean /* Header stickyness */\n height: number /* Header visible height */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount header from source observable\n *\n * @param options - Options\n *\n * @return Operator function\n */\nexport function mountHeader(\n { viewport$ }: MountOptions\n): OperatorFunction {\n return pipe(\n switchMap(el => {\n const header$ = watchHeader(el)\n\n /* Compute whether the header should switch to page header */\n const type$ = useComponent(\"main\")\n .pipe(\n map(main => getElement(\"h1, h2, h3, h4, h5, h6\", main)!),\n filter(hx => typeof hx !== \"undefined\"),\n withLatestFrom(useComponent(\"header-title\")),\n switchMap(([hx, title]) => watchViewportAt(hx, { header$, viewport$ })\n .pipe(\n map(({ offset: { y } }) => {\n return y >= hx.offsetHeight ? \"page\" : \"site\"\n }),\n distinctUntilChanged(),\n applyHeaderType(title)\n )\n ),\n startWith(\"site\")\n )\n\n /* Combine into single observable */\n return combineLatest([header$, type$])\n .pipe(\n map(([header, type]): Header => ({ type, ...header })),\n shareReplay(1)\n )\n })\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n MonoTypeOperatorFunction,\n Observable,\n animationFrameScheduler,\n of,\n pipe\n} from \"rxjs\"\nimport {\n finalize,\n map,\n observeOn,\n shareReplay,\n tap\n} from \"rxjs/operators\"\n\nimport { watchElementSize } from \"browser\"\n\nimport { Header, HeaderType } from \"../_\"\nimport {\n resetHeaderTitleActive,\n setHeaderTitleActive\n} from \"../set\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch header\n *\n * @param el - Header element\n *\n * @return Header observable\n */\nexport function watchHeader(\n el: HTMLElement\n): Observable> {\n const styles = getComputedStyle(el)\n if ([\n \"sticky\", /* Modern browsers */\n \"-webkit-sticky\" /* Safari */\n ].includes(styles.position)) {\n return watchElementSize(el)\n .pipe(\n map(({ height }) => ({\n sticky: true,\n height\n })),\n shareReplay(1)\n )\n } else {\n return of({\n sticky: false,\n height: 0\n })\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Apply header title type\n *\n * @param el - Header title element\n *\n * @return Operator function\n */\nexport function applyHeaderType(\n el: HTMLElement\n): MonoTypeOperatorFunction {\n return pipe(\n\n /* Defer repaint to next animation frame */\n observeOn(animationFrameScheduler),\n tap(type => {\n setHeaderTitleActive(el, type === \"page\")\n }),\n\n /* Reset on complete or error */\n finalize(() => {\n resetHeaderTitleActive(el)\n })\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set header title active\n *\n * @param el - Header title element\n * @param value - Whether the title is shown\n */\nexport function setHeaderTitleActive(\n el: HTMLElement, value: boolean\n): void {\n el.setAttribute(\"data-md-state\", value ? \"active\" : \"\")\n}\n\n/**\n * Reset header title active\n *\n * @param el - Header title element\n */\nexport function resetHeaderTitleActive(\n el: HTMLElement\n): void {\n el.removeAttribute(\"data-md-state\")\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, OperatorFunction, pipe } from \"rxjs\"\nimport { distinctUntilChanged, map, switchMap } from \"rxjs/operators\"\n\nimport { Viewport, watchViewportAt } from \"browser\"\n\nimport { Header } from \"../../header\"\nimport { applyHero } from \"../react\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Hero\n */\nexport interface Hero {\n hidden: boolean /* Whether the hero is hidden */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n header$: Observable /* Header observable */\n viewport$: Observable /* Viewport observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount hero from source observable\n *\n * @param options - Options\n *\n * @return Operator function\n */\nexport function mountHero(\n { header$, viewport$ }: MountOptions\n): OperatorFunction {\n return pipe(\n switchMap(el => watchViewportAt(el, { header$, viewport$ })\n .pipe(\n map(({ offset: { y } }) => ({ hidden: y >= 20 })),\n distinctUntilChanged(),\n applyHero(el)\n )\n )\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n MonoTypeOperatorFunction,\n animationFrameScheduler,\n pipe\n} from \"rxjs\"\nimport { finalize, observeOn, tap } from \"rxjs/operators\"\n\nimport { Hero } from \"../_\"\nimport {\n resetHeroHidden,\n setHeroHidden\n} from \"../set\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Apply hero\n *\n * @param el - Hero element\n *\n * @return Operator function\n */\nexport function applyHero(\n el: HTMLElement\n): MonoTypeOperatorFunction {\n return pipe(\n\n /* Defer repaint to next animation frame */\n observeOn(animationFrameScheduler),\n tap(({ hidden }) => {\n setHeroHidden(el, hidden)\n }),\n\n /* Reset on complete or error */\n finalize(() => {\n resetHeroHidden(el)\n })\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set hero hidden\n *\n * @param el - Hero element\n * @param value - Whether the element is hidden\n */\nexport function setHeroHidden(\n el: HTMLElement, value: boolean\n): void {\n el.setAttribute(\"data-md-state\", value ? \"hidden\" : \"\")\n}\n\n/**\n * Reset hero hidden\n *\n * @param el - Hero element\n */\nexport function resetHeroHidden(\n el: HTMLElement\n): void {\n el.removeAttribute(\"data-md-state\")\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, OperatorFunction, Subject, pipe } from \"rxjs\"\nimport { distinctUntilKeyChanged, switchMap, tap } from \"rxjs/operators\"\n\nimport { Viewport } from \"browser\"\n\nimport { useComponent } from \"../../_\"\nimport { Header } from \"../../header\"\nimport {\n applyHeaderShadow,\n watchMain\n} from \"../react\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Main area\n */\nexport interface Main {\n offset: number /* Main area top offset */\n height: number /* Main area visible height */\n active: boolean /* Scrolled past top offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n header$: Observable /* Header observable */\n viewport$: Observable /* Viewport observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount main area from source observable\n *\n * The header must be connected to the main area observable outside of the\n * operator function, as the header will persist in-between document switches\n * while the main area is replaced. However, the header observable must be\n * passed to this function, so we connect both via a long-living subject.\n *\n * @param options - Options\n *\n * @return Operator function\n */\nexport function mountMain(\n { header$, viewport$ }: MountOptions\n): OperatorFunction {\n const main$ = new Subject()\n\n /* Connect to main area observable via long-living subject */\n useComponent(\"header\")\n .pipe(\n switchMap(header => main$\n .pipe(\n distinctUntilKeyChanged(\"active\"),\n applyHeaderShadow(header)\n )\n )\n )\n .subscribe()\n\n /* Return operator */\n return pipe(\n switchMap(el => watchMain(el, { header$, viewport$ })),\n tap(main => main$.next(main))\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n MonoTypeOperatorFunction,\n Observable,\n animationFrameScheduler,\n combineLatest,\n pipe\n} from \"rxjs\"\nimport {\n distinctUntilChanged,\n distinctUntilKeyChanged,\n finalize,\n map,\n observeOn,\n pluck,\n shareReplay,\n switchMap,\n tap\n} from \"rxjs/operators\"\n\nimport { Viewport, watchElementSize } from \"browser\"\n\nimport { Header } from \"../../header\"\nimport { Main } from \"../_\"\nimport {\n resetHeaderShadow,\n setHeaderShadow\n} from \"../set\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n header$: Observable /* Header observable */\n viewport$: Observable /* Viewport observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch main area\n *\n * This function returns an observable that computes the visual parameters of\n * the main area which depends on the viewport vertical offset and height, as\n * well as the height of the header element, if the header is fixed.\n *\n * @param el - Main area element\n * @param options - Options\n *\n * @return Main area observable\n */\nexport function watchMain(\n el: HTMLElement, { header$, viewport$ }: WatchOptions\n): Observable {\n\n /* Compute necessary adjustment for header */\n const adjust$ = header$\n .pipe(\n pluck(\"height\"),\n distinctUntilChanged(),\n shareReplay(1)\n )\n\n /* Compute the main area's top and bottom markers */\n const marker$ = adjust$\n .pipe(\n switchMap(() => watchElementSize(el)\n .pipe(\n map(({ height }) => ({\n top: el.offsetTop,\n bottom: el.offsetTop + height\n }))\n )\n ),\n distinctUntilKeyChanged(\"top\"),\n shareReplay(1)\n )\n\n /* Compute the main area's visible height */\n const height$ = combineLatest([adjust$, marker$, viewport$])\n .pipe(\n map(([header, { top, bottom }, { offset: { y }, size: { height } }]) => {\n return height\n - Math.max(0, top - y, header)\n - Math.max(0, height + y - bottom)\n }),\n map(height => Math.max(0, height)),\n distinctUntilChanged()\n )\n\n /* Compute whether the viewport offset is past the main area's top */\n const active$ = combineLatest([adjust$, marker$, viewport$])\n .pipe(\n map(([header, { top }, { offset: { y } }]) => y >= top - header),\n distinctUntilChanged()\n )\n\n /* Combine into a single observable */\n return combineLatest([adjust$, marker$, height$, active$])\n .pipe(\n map(([header, { top }, height, active]) => ({\n offset: top - header,\n height,\n active\n }))\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Apply header shadow\n *\n * @param el - Header element\n *\n * @return Operator function\n */\nexport function applyHeaderShadow(\n el: HTMLElement\n): MonoTypeOperatorFunction {\n return pipe(\n\n /* Defer repaint to next animation frame */\n observeOn(animationFrameScheduler),\n tap(({ active }) => {\n setHeaderShadow(el, active)\n }),\n\n /* Reset on complete or error */\n finalize(() => {\n resetHeaderShadow(el)\n })\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set header shadow\n *\n * @param el - Header element\n * @param value - Whether the shadow is shown\n */\nexport function setHeaderShadow(\n el: HTMLElement, value: boolean\n): void {\n el.setAttribute(\"data-md-state\", value ? \"shadow\" : \"\")\n}\n\n/**\n * Reset header shadow\n *\n * @param el - Header element\n */\nexport function resetHeaderShadow(\n el: HTMLElement\n): void {\n el.removeAttribute(\"data-md-state\")\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, OperatorFunction, of, pipe } from \"rxjs\"\nimport { distinctUntilChanged, map, switchMap } from \"rxjs/operators\"\n\nimport { Viewport, watchViewportAt } from \"browser\"\n\nimport { Header } from \"../../header\"\nimport { applyTabs } from \"../react\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Tabs\n */\nexport interface Tabs {\n hidden: boolean /* Whether the tabs are hidden */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n header$: Observable /* Header observable */\n viewport$: Observable /* Viewport observable */\n screen$: Observable /* Media screen observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount tabs from source observable\n *\n * @param options - Options\n *\n * @return Operator function\n */\nexport function mountTabs(\n { header$, viewport$, screen$ }: MountOptions\n): OperatorFunction {\n return pipe(\n switchMap(el => screen$\n .pipe(\n switchMap(screen => {\n\n /* [screen +]: Mount tabs above screen breakpoint */\n if (screen) {\n return watchViewportAt(el, { header$, viewport$ })\n .pipe(\n map(({ offset: { y } }) => ({ hidden: y >= 10 })),\n distinctUntilChanged(),\n applyTabs(el)\n )\n\n /* [screen -]: Unmount tabs below screen breakpoint */\n } else {\n return of({ hidden: true })\n }\n })\n )\n )\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n MonoTypeOperatorFunction,\n animationFrameScheduler,\n pipe\n} from \"rxjs\"\nimport { finalize, observeOn, tap } from \"rxjs/operators\"\n\nimport { Tabs } from \"../_\"\nimport {\n resetTabsHidden,\n setTabsHidden\n} from \"../set\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Apply tabs\n *\n * @param el - Tabs element\n *\n * @return Operator function\n */\nexport function applyTabs(\n el: HTMLElement\n): MonoTypeOperatorFunction {\n return pipe(\n\n /* Defer repaint to next animation frame */\n observeOn(animationFrameScheduler),\n tap(({ hidden }) => {\n setTabsHidden(el, hidden)\n }),\n\n /* Reset on complete or error */\n finalize(() => {\n resetTabsHidden(el)\n })\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set tabs hidden\n *\n * @param el - Tabs element\n * @param value - Whether the element is hidden\n */\nexport function setTabsHidden(\n el: HTMLElement, value: boolean\n): void {\n el.setAttribute(\"data-md-state\", value ? \"hidden\" : \"\")\n}\n\n/**\n * Reset tabs hidden\n *\n * @param el - Tabs element\n */\nexport function resetTabsHidden(\n el: HTMLElement\n): void {\n el.removeAttribute(\"data-md-state\")\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { NEVER, Observable, fromEvent, iif, merge } from \"rxjs\"\nimport { map, mapTo, shareReplay, switchMap } from \"rxjs/operators\"\n\nimport { getElements } from \"browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch options\n */\ninterface PatchOptions {\n document$: Observable /* Document observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Check whether the given device is an Apple device\n *\n * @return Test result\n */\nfunction isAppleDevice(): boolean {\n return /(iPad|iPhone|iPod)/.test(navigator.userAgent)\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch all elements with `data-md-scrollfix` attributes\n *\n * This is a year-old patch which ensures that overflow scrolling works at the\n * top and bottom of containers on iOS by ensuring a `1px` scroll offset upon\n * the start of a touch event.\n *\n * @see https://bit.ly/2SCtAOO - Original source\n *\n * @param options - Options\n */\nexport function patchScrollfix(\n { document$ }: PatchOptions\n): void {\n const els$ = document$\n .pipe(\n map(() => getElements(\"[data-md-scrollfix]\")),\n shareReplay(1)\n )\n\n /* Remove marker attribute, so we'll only add the fix once */\n els$.subscribe(els => {\n for (const el of els)\n el.removeAttribute(\"data-md-scrollfix\")\n })\n\n /* Patch overflow scrolling on touch start */\n iif(isAppleDevice, els$, NEVER)\n .pipe(\n switchMap(els => merge(...els.map(el => (\n fromEvent(el, \"touchstart\")\n .pipe(\n mapTo(el)\n )\n ))))\n )\n .subscribe(el => {\n const top = el.scrollTop\n\n /* We're at the top of the container */\n if (top === 0) {\n el.scrollTop = 1\n\n /* We're at the bottom of the container */\n } else if (top + el.offsetHeight === el.scrollHeight) {\n el.scrollTop = top - 1\n }\n })\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { NEVER, Observable } from \"rxjs\"\nimport { catchError, map, switchMap } from \"rxjs/operators\"\n\nimport { getElementOrThrow, getElements } from \"browser\"\nimport { renderSource } from \"templates\"\nimport { cache, hash } from \"utilities\"\n\nimport { fetchSourceFactsFromGitHub } from \"./github\"\nimport { fetchSourceFactsFromGitLab } from \"./gitlab\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Source facts\n */\nexport type SourceFacts = string[]\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch options\n */\ninterface PatchOptions {\n document$: Observable /* Document observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch source facts\n *\n * @param url - Source repository URL\n *\n * @return Source facts observable\n */\nfunction fetchSourceFacts(\n url: string\n): Observable {\n const [type] = url.match(/(git(?:hub|lab))/i) || []\n switch (type.toLowerCase()) {\n\n /* GitHub repository */\n case \"github\":\n const [, user, repo] = url.match(/^.+github\\.com\\/([^\\/]+)\\/?([^\\/]+)/i)\n return fetchSourceFactsFromGitHub(user, repo)\n\n /* GitLab repository */\n case \"gitlab\":\n const [, base, project] = url.match(/^.+?([^\\/]*gitlab[^\\/]+)\\/(.+)/i)\n return fetchSourceFactsFromGitLab(base, project)\n\n /* Everything else */\n default:\n return NEVER\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch elements containing repository information\n *\n * This function will retrieve the URL from the repository link and try to\n * query data from integrated source code platforms like GitHub or GitLab.\n *\n * @param options - Options\n */\nexport function patchSource(\n { document$ }: PatchOptions\n): void {\n document$\n .pipe(\n map(() => getElementOrThrow(\".md-source[href]\")),\n switchMap(({ href }) => (\n cache(`${hash(href)}`, () => fetchSourceFacts(href))\n )),\n catchError(() => NEVER)\n )\n .subscribe(facts => {\n for (const el of getElements(\".md-source__repository\")) {\n if (!el.hasAttribute(\"data-md-state\")) {\n el.setAttribute(\"data-md-state\", \"done\")\n el.appendChild(renderSource(facts))\n }\n }\n })\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Repo, User } from \"github-types\"\nimport { Observable, of } from \"rxjs\"\nimport { ajax } from \"rxjs/ajax\"\nimport { filter, pluck, switchMap } from \"rxjs/operators\"\n\nimport { round } from \"utilities\"\n\nimport { SourceFacts } from \"..\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch GitHub source facts\n *\n * @param user - GitHub user\n * @param repo - GitHub repository\n *\n * @return Source facts observable\n */\nexport function fetchSourceFactsFromGitHub(\n user: string, repo?: string\n): Observable {\n return ajax({\n url: typeof repo !== \"undefined\"\n ? `https://api.github.com/repos/${user}/${repo}`\n : `https://api.github.com/users/${user}`,\n responseType: \"json\"\n })\n .pipe(\n filter(({ status }) => status === 200),\n pluck(\"response\"),\n switchMap(data => {\n\n /* GitHub repository */\n if (typeof repo !== \"undefined\") {\n const { stargazers_count, forks_count }: Repo = data\n return of([\n `${round(stargazers_count || 0)} Stars`,\n `${round(forks_count || 0)} Forks`\n ])\n\n /* GitHub user/organization */\n } else {\n const { public_repos }: User = data\n return of([\n `${round(public_repos || 0)} Repositories`\n ])\n }\n })\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { ProjectSchema } from \"gitlab\"\nimport { Observable } from \"rxjs\"\nimport { ajax } from \"rxjs/ajax\"\nimport { filter, map, pluck } from \"rxjs/operators\"\n\nimport { round } from \"utilities\"\n\nimport { SourceFacts } from \"..\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch GitLab source facts\n *\n * @param base - GitLab base\n * @param project - GitLab project\n *\n * @return Source facts observable\n */\nexport function fetchSourceFactsFromGitLab(\n base: string, project: string\n): Observable {\n return ajax({\n url: `https://${base}/api/v4/projects/${encodeURIComponent(project)}`,\n responseType: \"json\"\n })\n .pipe(\n filter(({ status }) => status === 200),\n pluck(\"response\"),\n map(({ star_count, forks_count }: ProjectSchema) => ([\n `${round(star_count)} Stars`,\n `${round(forks_count)} Forks`\n ]))\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n// TODO: remove this after we finished refactoring\n// tslint:disable\n\nimport \"../stylesheets/main.scss\"\nimport \"../stylesheets/palette.scss\"\n\nimport { values } from \"ramda\"\nimport {\n merge,\n combineLatest,\n animationFrameScheduler,\n fromEvent,\n of,\n NEVER\n} from \"rxjs\"\nimport {\n delay,\n switchMap,\n tap,\n filter,\n withLatestFrom,\n observeOn,\n take,\n shareReplay,\n share\n} from \"rxjs/operators\"\n\nimport {\n watchToggle,\n setToggle,\n getElements,\n watchMedia,\n watchDocument,\n watchLocation,\n watchLocationHash,\n watchViewport,\n isLocationInternal,\n isLocationAnchor,\n setLocationHash\n} from \"./browser\"\nimport { setupSearchWorker } from \"./workers\"\n\nimport {\n mountHeader,\n mountHero,\n mountMain,\n mountNavigation,\n mountSearch,\n mountTableOfContents,\n mountTabs,\n useComponent,\n setupComponents,\n mountSearchQuery,\n mountSearchReset,\n mountSearchResult\n} from \"components\"\nimport { setupClipboard } from \"./integrations/clipboard\"\nimport { setupDialog } from \"integrations/dialog\"\nimport { setupKeyboard } from \"./integrations/keyboard\"\nimport { setupInstantLoading } from \"integrations/instant\"\nimport {\n patchTables,\n patchDetails,\n patchScrollfix,\n patchSource,\n patchScripts\n} from \"patches\"\nimport { isConfig } from \"utilities\"\n\n/* ------------------------------------------------------------------------- */\n\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Test for iOS */\nif (navigator.userAgent.match(/(iPad|iPhone|iPod)/g))\n document.documentElement.classList.add(\"ios\")\n\n/**\n * Set scroll lock\n *\n * @param el - Scrollable element\n * @param value - Vertical offset\n */\nexport function setScrollLock(\n el: HTMLElement, value: number\n): void {\n el.setAttribute(\"data-md-state\", \"lock\")\n el.style.top = `-${value}px`\n}\n\n/**\n * Reset scroll lock\n *\n * @param el - Scrollable element\n */\nexport function resetScrollLock(\n el: HTMLElement\n): void {\n const value = -1 * parseInt(el.style.top, 10)\n el.removeAttribute(\"data-md-state\")\n el.style.top = \"\"\n if (value)\n window.scrollTo(0, value)\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Initialize Material for MkDocs\n *\n * @param config - Configuration\n */\nexport function initialize(config: unknown) {\n if (!isConfig(config))\n throw new SyntaxError(`Invalid configuration: ${JSON.stringify(config)}`)\n\n /* Setup user interface observables */\n const location$ = watchLocation()\n const hash$ = watchLocationHash()\n const viewport$ = watchViewport()\n const tablet$ = watchMedia(\"(min-width: 960px)\")\n const screen$ = watchMedia(\"(min-width: 1220px)\")\n\n /* Setup document observable */\n const document$ = config.features.includes(\"instant\")\n ? watchDocument({ location$ })\n : watchDocument()\n\n /* Setup component bindings */\n setupComponents([\n \"container\", /* Container */\n \"header\", /* Header */\n \"header-title\", /* Header title */\n \"hero\", /* Hero */\n \"main\", /* Main area */\n \"navigation\", /* Navigation */\n \"search\", /* Search */\n \"search-query\", /* Search input */\n \"search-reset\", /* Search reset */\n \"search-result\", /* Search results */\n \"skip\", /* Skip link */\n \"tabs\", /* Tabs */\n \"toc\" /* Table of contents */\n ], { document$ })\n\n /* ----------------------------------------------------------------------- */\n\n // External index\n const index = config.search && config.search.index\n ? config.search.index\n : undefined\n\n // TODO: pass URL config as first parameter, options as second\n const worker = setupSearchWorker(config.url.worker.search, {\n base: config.url.base, index, location$\n })\n\n /* ----------------------------------------------------------------------- */\n\n /* Create header observable */\n const header$ = useComponent(\"header\")\n .pipe(\n mountHeader({ viewport$ }),\n shareReplay(1)\n )\n\n const main$ = useComponent(\"main\")\n .pipe(\n mountMain({ header$, viewport$ }),\n shareReplay(1)\n )\n\n /* ----------------------------------------------------------------------- */\n\n /* Mount search query */\n const query$ = useComponent(\"search-query\")\n .pipe(\n mountSearchQuery(worker),\n shareReplay(1)\n )\n\n /* Mount search reset */\n const reset$ = useComponent(\"search-reset\")\n .pipe(\n mountSearchReset(),\n shareReplay(1)\n )\n\n /* Mount search result */\n const result$ = useComponent(\"search-result\")\n .pipe(\n mountSearchResult(worker, { query$ }),\n shareReplay(1)\n )\n\n /* ----------------------------------------------------------------------- */\n\n const search$ = useComponent(\"search\")\n .pipe(\n mountSearch({ query$, reset$, result$ }),\n shareReplay(1)\n )\n\n /* ----------------------------------------------------------------------- */\n\n const navigation$ = useComponent(\"navigation\")\n .pipe(\n mountNavigation({ header$, main$, viewport$, screen$ }),\n shareReplay(1) // shareReplay because there might be late subscribers\n )\n\n const toc$ = useComponent(\"toc\")\n .pipe(\n mountTableOfContents({ header$, main$, viewport$, tablet$ }),\n shareReplay(1)\n )\n\n const tabs$ = useComponent(\"tabs\")\n .pipe(\n mountTabs({ header$, viewport$, screen$ }),\n shareReplay(1)\n )\n\n const hero$ = useComponent(\"hero\")\n .pipe(\n mountHero({ header$, viewport$ }),\n shareReplay(1)\n )\n\n /* ----------------------------------------------------------------------- */\n\n const keyboard$ = setupKeyboard()\n\n patchDetails({ document$, hash$ })\n patchScripts({ document$ })\n patchSource({ document$ })\n patchTables({ document$ })\n\n /* Force 1px scroll offset to trigger overflow scrolling */\n patchScrollfix({ document$ })\n\n /* Setup clipboard and dialog */\n const dialog$ = setupDialog()\n const clipboard$ = setupClipboard({ document$, dialog$ })\n\n /* ----------------------------------------------------------------------- */\n\n // // put into search...\n hash$\n .pipe(\n tap(() => setToggle(\"search\", false)),\n delay(125), // ensure that it runs after the body scroll reset...\n )\n .subscribe(hash => setLocationHash(`#${hash}`)) // TODO: must be unified\n\n // Scroll lock // document -> document$ => { body } !?\n // put into search...\n combineLatest([\n watchToggle(\"search\"),\n tablet$,\n ])\n .pipe(\n withLatestFrom(viewport$),\n switchMap(([[toggle, tablet], { offset: { y }}]) => {\n const active = toggle && !tablet\n return document$\n .pipe(\n delay(active ? 400 : 100), // TOOD: directly combine this with the hash!\n observeOn(animationFrameScheduler),\n tap(({ body }) => active\n ? setScrollLock(body, y)\n : resetScrollLock(body)\n )\n )\n })\n )\n .subscribe()\n\n /* ----------------------------------------------------------------------- */\n\n /* Intercept internal link clicks */\n const link$ = fromEvent(document.body, \"click\")\n .pipe(\n filter(ev => !(ev.metaKey || ev.ctrlKey)),\n switchMap(ev => {\n if (ev.target instanceof HTMLElement) {\n const el = ev.target.closest(\"a\") // TODO: abstract as link click?\n if (el && isLocationInternal(el)) {\n if (!isLocationAnchor(el) && config.features.includes(\"instant\"))\n ev.preventDefault()\n return of(el)\n }\n }\n return NEVER\n }),\n share()\n )\n\n /* Always close drawer on click */\n link$.subscribe(() => {\n setToggle(\"drawer\", false)\n })\n\n // somehow call this setupNavigation ?\n\n // instant loading\n if (config.features.includes(\"instant\")) {\n\n /* Disable automatic scroll restoration, as it doesn't work nicely */\n if (\"scrollRestoration\" in history)\n history.scrollRestoration = \"manual\"\n\n /* Resolve relative links for stability */\n for (const selector of [\n `link[rel=\"shortcut icon\"]`,\n // `link[rel=\"stylesheet\"]` // reduce style computations\n ])\n for (const el of getElements(selector))\n el.href = el.href\n\n setupInstantLoading({\n document$, link$, location$, viewport$\n })\n\n }\n\n /* ----------------------------------------------------------------------- */\n\n // if we use a single tab outside of search, unhide all permalinks.\n // TODO: experimental. necessary!?\n keyboard$\n .pipe(\n filter(key => key.mode === \"global\" && [\"Tab\"].includes(key.type)),\n take(1)\n )\n .subscribe(() => {\n for (const link of getElements(\".headerlink\"))\n link.style.visibility = \"visible\"\n })\n\n /* ----------------------------------------------------------------------- */\n\n const state = {\n\n /* Browser observables */\n document$,\n viewport$,\n\n /* Component observables */\n header$,\n hero$,\n main$,\n navigation$,\n search$,\n tabs$,\n toc$,\n\n /* Integation observables */\n clipboard$,\n keyboard$,\n dialog$\n }\n\n /* Subscribe to all observables */\n merge(...values(state))\n .subscribe()\n return state\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable } from \"rxjs\"\nimport {\n filter,\n map,\n share,\n withLatestFrom\n} from \"rxjs/operators\"\n\nimport {\n Key,\n getActiveElement,\n getElement,\n getElements,\n getToggle,\n isSusceptibleToKeyboard,\n setElementFocus,\n setElementSelection,\n setToggle,\n watchKeyboard\n} from \"browser\"\nimport { useComponent } from \"components\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Keyboard mode\n */\nexport type KeyboardMode =\n | \"global\" /* Global */\n | \"search\" /* Search is open */\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Keyboard\n */\nexport interface Keyboard extends Key {\n mode: KeyboardMode /* Keyboard mode */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup keyboard\n *\n * This function will setup the keyboard handlers and ensure that keys are\n * correctly propagated. Currently there are two modes:\n *\n * - `global`: This mode is active when the search is closed. It is intended\n * to assign hotkeys to specific functions of the site. Currently the search,\n * previous and next page can be triggered.\n *\n * - `search`: This mode is active when the search is open. It maps certain\n * navigational keys to offer search results that can be entirely navigated\n * through keyboard input.\n *\n * The keyboard observable is returned and can be used to monitor the keyboard\n * in order toassign further hotkeys to custom functions.\n *\n * @return Keyboard observable\n */\nexport function setupKeyboard(): Observable {\n const keyboard$ = watchKeyboard()\n .pipe(\n map(key => ({\n mode: getToggle(\"search\") ? \"search\" : \"global\",\n ...key\n })),\n share()\n )\n\n /* Setup search keyboard handlers */\n keyboard$\n .pipe(\n filter(({ mode }) => mode === \"search\"),\n withLatestFrom(\n useComponent(\"search-query\"),\n useComponent(\"search-result\")\n )\n )\n .subscribe(([key, query, result]) => {\n const active = getActiveElement()\n switch (key.type) {\n\n /* Enter: prevent form submission */\n case \"Enter\":\n if (active === query)\n key.claim()\n break\n\n /* Escape or Tab: close search */\n case \"Escape\":\n case \"Tab\":\n setToggle(\"search\", false)\n setElementFocus(query, false)\n break\n\n /* Vertical arrows: select previous or next search result */\n case \"ArrowUp\":\n case \"ArrowDown\":\n if (typeof active === \"undefined\") {\n setElementFocus(query)\n } else {\n const els = [query, ...getElements(\"[href]\", result)]\n const i = Math.max(0, (\n Math.max(0, els.indexOf(active)) + els.length + (\n key.type === \"ArrowUp\" ? -1 : +1\n )\n ) % els.length)\n setElementFocus(els[i])\n }\n\n /* Prevent scrolling of page */\n key.claim()\n break\n\n /* All other keys: hand to search query */\n default:\n if (query !== getActiveElement())\n setElementFocus(query)\n }\n })\n\n /* Setup global keyboard handlers */\n keyboard$\n .pipe(\n filter(({ mode }) => {\n if (mode === \"global\") {\n const active = getActiveElement()\n if (typeof active !== \"undefined\")\n return !isSusceptibleToKeyboard(active)\n }\n return false\n }),\n withLatestFrom(useComponent(\"search-query\"))\n )\n .subscribe(([key, query]) => {\n switch (key.type) {\n\n /* Open search and select query */\n case \"f\":\n case \"s\":\n case \"/\":\n setElementFocus(query)\n setElementSelection(query)\n key.claim()\n break\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getElement(\"[href][rel=prev]\")\n if (typeof prev !== \"undefined\")\n prev.click()\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getElement(\"[href][rel=next]\")\n if (typeof next !== \"undefined\")\n next.click()\n break\n }\n })\n\n /* Return keyboard */\n return keyboard$\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { identity } from \"ramda\"\nimport { Observable, fromEvent, merge } from \"rxjs\"\nimport {\n filter,\n map,\n switchMapTo,\n tap\n} from \"rxjs/operators\"\n\nimport {\n getElement,\n getElements,\n watchMedia\n} from \"browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch options\n */\ninterface PatchOptions {\n document$: Observable /* Document observable */\n hash$: Observable /* Location hash observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch all `details` elements\n *\n * This function will ensure that all `details` tags are opened prior to\n * printing, so the whole content of the page is included, and on anchor jumps.\n *\n * @param options - Options\n */\nexport function patchDetails(\n { document$, hash$ }: PatchOptions\n): void {\n const els$ = document$\n .pipe(\n map(() => getElements(\"details\"))\n )\n\n /* Open all details before printing */\n merge(\n watchMedia(\"print\").pipe(filter(identity)), /* Webkit */\n fromEvent(window, \"beforeprint\") /* IE, FF */\n )\n .pipe(\n switchMapTo(els$)\n )\n .subscribe(els => {\n for (const el of els)\n el.setAttribute(\"open\", \"\")\n })\n\n /* Open parent details and fix anchor jump */\n hash$\n .pipe(\n map(id => getElement(`[id=\"${id}\"]`)!),\n filter(el => typeof el !== \"undefined\"),\n tap(el => {\n const details = el.closest(\"details\")\n if (details && !details.open)\n details.setAttribute(\"open\", \"\")\n })\n )\n .subscribe(el => el.scrollIntoView())\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable } from \"rxjs\"\nimport { map, skip, withLatestFrom } from \"rxjs/operators\"\n\nimport { getElements } from \"browser\"\nimport { useComponent } from \"components\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch options\n */\ninterface PatchOptions {\n document$: Observable /* Document observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch all `script` elements\n *\n * This function must be run after a document switch, which means the first\n * emission must be ignored.\n *\n * @param options - Options\n */\nexport function patchScripts(\n { document$ }: PatchOptions\n): void {\n const els$ = document$\n .pipe(\n skip(1),\n withLatestFrom(useComponent(\"container\")),\n map(([, el]) => getElements(\"script\", el))\n )\n\n /* Evaluate all scripts via replacement */\n els$.subscribe(els => {\n for (const el of els) {\n if (el.src || /(^|\\/javascript)$/i.test(el.type)) {\n const script = document.createElement(\"script\")\n const key = el.src ? \"src\" : \"textContent\"\n script[key] = el[key]!\n el.replaceWith(script)\n }\n }\n })\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable } from \"rxjs\"\nimport { map } from \"rxjs/operators\"\n\nimport { getElements } from \"browser\"\nimport { renderTable } from \"templates\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n document$: Observable /* Document observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch all `table` elements\n *\n * This function will re-render all tables by wrapping them to improve overflow\n * scrolling on smaller screen sizes.\n *\n * @param options - Options\n */\nexport function patchTables(\n { document$ }: MountOptions\n): void {\n const sentinel = document.createElement(\"table\")\n document$\n .pipe(\n map(() => getElements(\"table:not([class])\"))\n )\n .subscribe(els => {\n for (const el of els) {\n el.replaceWith(sentinel)\n sentinel.replaceWith(renderTable(el))\n }\n })\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Subject, animationFrameScheduler, of } from \"rxjs\"\nimport {\n delay,\n map,\n observeOn,\n switchMap,\n tap\n} from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup options\n */\ninterface SetupOptions {\n duration?: number /* Display duration (default: 2s) */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup dialog\n *\n * @param options - Options\n *\n * @return Dialog observable\n */\nexport function setupDialog(\n { duration }: SetupOptions = {}\n): Subject {\n const dialog$ = new Subject()\n\n /* Create dialog */\n const dialog = document.createElement(\"div\") // TODO: improve scoping\n dialog.classList.add(\"md-dialog\", \"md-typeset\")\n\n /* Display dialog */\n dialog$\n .pipe(\n switchMap(text => of(document.body) // useComponent(\"container\")\n .pipe(\n map(container => container.appendChild(dialog)),\n observeOn(animationFrameScheduler),\n delay(1), // Strangley it doesnt work when we push things to the new animation frame...\n tap(el => {\n el.innerHTML = text\n el.setAttribute(\"data-md-state\", \"open\")\n }),\n delay(duration || 2000),\n tap(el => el.removeAttribute(\"data-md-state\")),\n delay(400),\n tap(el => {\n el.innerHTML = \"\"\n el.remove()\n })\n )\n )\n )\n .subscribe()\n\n /* Return dialog subject */\n return dialog$\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport * as ClipboardJS from \"clipboard\"\nimport { NEVER, Observable, Subject, fromEventPattern } from \"rxjs\"\nimport { mapTo, share, tap } from \"rxjs/operators\"\n\nimport { getElements } from \"browser\"\nimport { renderClipboard } from \"templates\"\nimport { translate } from \"utilities\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup options\n */\ninterface SetupOptions {\n document$: Observable /* Document observable */\n dialog$: Subject /* Dialog subject */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup clipboard\n *\n * This function implements the Clipboard.js integration and injects a button\n * into all code blocks when the document changes.\n *\n * @param options - Options\n *\n * @return Clipboard observable\n */\nexport function setupClipboard(\n { document$, dialog$ }: SetupOptions\n): Observable {\n if (!ClipboardJS.isSupported())\n return NEVER\n\n /* Inject 'copy-to-clipboard' buttons */\n document$.subscribe(() => {\n const blocks = getElements(\"pre > code\")\n blocks.forEach((block, index) => {\n const parent = block.parentElement!\n parent.id = `__code_${index}`\n parent.insertBefore(renderClipboard(parent.id), block)\n })\n })\n\n /* Initialize and setup clipboard */\n const clipboard$ = fromEventPattern(next => {\n new ClipboardJS(\".md-clipboard\").on(\"success\", next)\n })\n .pipe(\n share()\n )\n\n /* Display notification for clipboard event */\n clipboard$\n .pipe(\n tap(ev => ev.clearSelection()),\n mapTo(translate(\"clipboard.copied\"))\n )\n .subscribe(dialog$)\n\n /* Return clipboard */\n return clipboard$\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, Subject, fromEvent, merge } from \"rxjs\"\nimport {\n bufferCount,\n debounceTime,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n map,\n pluck,\n sample,\n share,\n withLatestFrom\n} from \"rxjs/operators\"\n\nimport {\n Viewport,\n ViewportOffset,\n getElement,\n isLocationAnchor,\n setLocationHash,\n setViewportOffset\n} from \"browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * History state\n */\ninterface State {\n url: URL /* State URL */\n offset?: ViewportOffset /* State viewport offset */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Setup options\n */\ninterface SetupOptions {\n document$: Observable /* Document observable */\n viewport$: Observable /* Viewport observable */\n link$: Observable /* Internal link observable */\n location$: Subject /* Location subject */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup instant loading\n *\n * @param options - Options\n *\n * @return TODO ?\n */\nexport function setupInstantLoading(\n { document$, viewport$, link$, location$ }: SetupOptions\n) { // TODO: add return type\n const state$ = link$\n .pipe(\n map(el => ({ url: new URL(el.href) })),\n share()\n )\n\n /* Intercept internal links to dispatch */\n const push$ = state$\n .pipe(\n distinctUntilChanged((prev, next) => prev.url.href === next.url.href),\n filter(({ url }) => !isLocationAnchor(url)),\n share()\n )\n\n /* Intercept popstate events (history back and forward) */\n const pop$ = fromEvent(window, \"popstate\")\n .pipe(\n filter(ev => ev.state !== null),\n map(ev => ({\n url: new URL(location.href),\n offset: ev.state\n })),\n share()\n )\n\n /* Emit location change */\n merge(push$, pop$)\n .pipe(\n pluck(\"url\")\n )\n .subscribe(location$)\n\n /* History: debounce update of viewport offset */\n viewport$\n .pipe(\n debounceTime(250),\n distinctUntilKeyChanged(\"offset\")\n )\n .subscribe(({ offset }) => {\n history.replaceState(offset, \"\")\n })\n\n /* Apply viewport offset from history */\n merge(state$, pop$)\n .pipe(\n bufferCount(2, 1),\n filter(([prev, next]) => {\n return prev.url.pathname === next.url.pathname\n && !isLocationAnchor(next.url)\n }),\n map(([, state]) => state)\n )\n .subscribe(({ offset }) => {\n setViewportOffset(offset || { y: 0 })\n })\n\n /* Intercept actual instant loading */\n const instant$ = merge(push$, pop$)\n .pipe(\n sample(document$)\n )\n\n // TODO: from here on, everything is beta.... ###############################\n\n instant$.subscribe(({ url, offset }) => {\n if (url.hash && !offset) {\n // console.log(\"set hash!\")\n setLocationHash(url.hash) // must delay, if search is open!\n } else {\n setViewportOffset(offset || { y: 0 })\n }\n })\n\n instant$\n .pipe(\n withLatestFrom(document$)\n )\n .subscribe(([, { title, head }]) => {\n document.dispatchEvent(new CustomEvent(\"DOMContentSwitch\"))\n document.title = title\n\n /* Replace meta tags */\n for (const selector of [\n `link[rel=\"canonical\"]`,\n `meta[name=\"author\"]`,\n `meta[name=\"description\"]`\n ]) {\n const next = getElement(selector, head)\n const prev = getElement(selector, document.head)\n if (\n typeof next !== \"undefined\" &&\n typeof prev !== \"undefined\"\n ) {\n prev.replaceWith(next)\n }\n }\n })\n}\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/assets/javascripts/browser/location/_/index.ts","webpack:///./src/assets/javascripts/browser/location/hash/index.ts","webpack:///./src/assets/javascripts/browser/document/switch/index.ts","webpack:///./src/assets/javascripts/browser/document/_/index.ts","webpack:///./src/assets/javascripts/browser/element/_/index.ts","webpack:///./src/assets/javascripts/browser/element/focus/index.ts","webpack:///./src/assets/javascripts/browser/element/offset/index.ts","webpack:///./src/assets/javascripts/browser/element/select/index.ts","webpack:///./src/assets/javascripts/browser/element/size/index.ts","webpack:///./src/assets/javascripts/browser/keyboard/index.ts","webpack:///./src/assets/javascripts/browser/media/index.ts","webpack:///./src/assets/javascripts/browser/toggle/index.ts","webpack:///./src/assets/javascripts/browser/viewport/offset/index.ts","webpack:///./src/assets/javascripts/browser/viewport/size/index.ts","webpack:///./src/assets/javascripts/browser/viewport/_/index.ts","webpack:///./src/assets/javascripts/browser/worker/index.ts","webpack:///./src/assets/javascripts/utilities/config/index.ts","webpack:///./src/assets/javascripts/utilities/jsx/index.ts","webpack:///./src/assets/javascripts/utilities/rxjs/index.ts","webpack:///./src/assets/javascripts/utilities/string/index.ts","webpack:///./src/assets/javascripts/components/index.ts","webpack:///./src/assets/javascripts/components/shared/sidebar/set/index.ts","webpack:///./src/assets/javascripts/components/_/index.ts","webpack:///./src/assets/javascripts/components/toc/anchor/set/index.ts","webpack:///./src/assets/javascripts/components/shared/index.ts","webpack:///./src/assets/javascripts/templates/clipboard/index.tsx","webpack:///./src/assets/javascripts/templates/search/index.tsx","webpack:///./src/assets/javascripts/templates/source/index.tsx","webpack:///./src/assets/javascripts/templates/table/index.tsx","webpack:///./src/assets/javascripts/components/navigation/layer/set/index.ts","webpack:///./src/assets/javascripts/workers/search/message/index.ts","webpack:///./src/assets/javascripts/workers/search/_/index.ts","webpack:///./src/assets/javascripts/components/navigation/layer/index.ts","webpack:///./src/assets/javascripts/components/toc/anchor/index.ts","webpack:///./src/assets/javascripts/components/navigation/index.ts","webpack:///./src/assets/javascripts/components/navigation/_/index.ts","webpack:///./src/assets/javascripts/components/shared/sidebar/index.ts","webpack:///./src/assets/javascripts/components/shared/sidebar/react/index.ts","webpack:///./src/assets/javascripts/components/navigation/layer/react/index.ts","webpack:///./src/assets/javascripts/components/toc/index.ts","webpack:///./src/assets/javascripts/components/toc/_/index.ts","webpack:///./src/assets/javascripts/components/toc/anchor/react/index.ts","webpack:///./src/assets/javascripts/components/search/_/index.ts","webpack:///./src/assets/javascripts/components/search/query/react/index.ts","webpack:///./src/assets/javascripts/components/search/query/_/index.ts","webpack:///./src/assets/javascripts/components/search/reset/_/index.ts","webpack:///./src/assets/javascripts/components/search/reset/react/index.ts","webpack:///./src/assets/javascripts/components/search/result/set/index.ts","webpack:///./src/assets/javascripts/components/search/result/react/index.ts","webpack:///./src/assets/javascripts/components/search/result/_/index.ts","webpack:///./src/assets/javascripts/components/header/_/index.ts","webpack:///./src/assets/javascripts/components/header/react/index.ts","webpack:///./src/assets/javascripts/components/header/set/index.ts","webpack:///./src/assets/javascripts/components/hero/_/index.ts","webpack:///./src/assets/javascripts/components/hero/react/index.ts","webpack:///./src/assets/javascripts/components/hero/set/index.ts","webpack:///./src/assets/javascripts/components/main/_/index.ts","webpack:///./src/assets/javascripts/components/main/react/index.ts","webpack:///./src/assets/javascripts/components/main/set/index.ts","webpack:///./src/assets/javascripts/components/tabs/_/index.ts","webpack:///./src/assets/javascripts/components/tabs/react/index.ts","webpack:///./src/assets/javascripts/components/tabs/set/index.ts","webpack:///./src/assets/javascripts/patches/scrollfix/index.ts","webpack:///./src/assets/javascripts/patches/source/index.ts","webpack:///./src/assets/javascripts/patches/source/github/index.ts","webpack:///./src/assets/javascripts/patches/source/gitlab/index.ts","webpack:///./src/assets/javascripts/index.ts","webpack:///./src/assets/javascripts/integrations/keyboard/index.ts","webpack:///./src/assets/javascripts/patches/details/index.ts","webpack:///./src/assets/javascripts/patches/script/index.ts","webpack:///./src/assets/javascripts/patches/table/index.ts","webpack:///./src/assets/javascripts/integrations/dialog/index.ts","webpack:///./src/assets/javascripts/integrations/clipboard/index.ts","webpack:///./src/assets/javascripts/integrations/instant/index.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","0","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","isLocationInternal","url","ref","host","test","pathname","isLocationAnchor","hash","watchLocation","BehaviorSubject","URL","location","href","getLocationHash","substring","setLocationHash","el","document","createElement","click","watchLocationHash","fromEvent","pipe","map","startWith","filter","share","watchDocumentSwitch","location$","dom","DOMParser","distinctUntilKeyChanged","skip","switchMap","ajax","responseType","withCredentials","response","history","pushState","toString","parseFromString","catchError","setLocation","watchDocument","merge","mapTo","shareReplay","getElement","selector","node","querySelector","undefined","getElementOrThrow","ReferenceError","getActiveElement","activeElement","HTMLElement","getElements","Array","from","querySelectorAll","setElementFocus","focus","blur","watchElementFocus","focus$","blur$","getElementOffset","x","scrollLeft","y","scrollTop","watchElementOffset","setElementSelection","HTMLInputElement","Error","select","watchElementSize","fromEventPattern","next","contentRect","width","Math","round","height","observe","offsetWidth","offsetHeight","getElementSize","isSusceptibleToKeyboard","tagName","isContentEditable","watchKeyboard","ev","metaKey","ctrlKey","type","claim","preventDefault","stopPropagation","watchMedia","query","media","matchMedia","addListener","matches","toggles","drawer","search","getToggle","checked","setToggle","watchToggle","getViewportOffset","max","pageXOffset","pageYOffset","setViewportOffset","scrollTo","getViewportSize","innerWidth","innerHeight","watchViewport","combineLatest","offset","size","watchViewportAt","header$","viewport$","offset$","offsetLeft","offsetTop","watchWorker","worker","tx$","rx$","addEventListener","pluck","throttle","leading","trailing","tap","message","postMessage","switchMapTo","isConfig","config","base","tag","createElementNS","setAttribute","setAttributeNS","appendChild","child","innerHTML","Node","isArray","h","attributes","keys","attr","children","cache","factory","defer","sessionStorage","getItem","of","JSON","parse","value$","subscribe","setItem","stringify","err","lang","translate","textContent","replace","truncate","toFixed","len","charCodeAt","setSidebarOffset","style","top","resetSidebarOffset","setSidebarHeight","resetSidebarHeight","setSidebarLock","resetSidebarLock","removeAttribute","components$","setupComponents","names","document$","reduce","components","prev","replaceWith","useComponent","setAnchorBlur","resetAnchorBlur","setAnchorActive","classList","toggle","resetAnchorActive","remove","css","renderClipboard","id","class","title","xmlns","viewBox","renderSearchResult","article","sections","icon","text","tabIndex","renderSource","facts","fact","renderTable","table","setOverflowScrolling","webkitOverflowScrolling","resetOverflowScrolling","SearchMessageType","isSearchResultMessage","RESULT","setupSearchWorker","index","Worker","origin$","take","Subject","withLatestFrom","origin","section","isConfigDefaultLang","isConfigDefaultSeparator","separator","pipeline","split","Boolean","rest","SETUP","observeOn","mountNavigation","main$","screen$","screen","sidebar","els","layer","watchSidebar","adjust","parentElement","height$","min","lock$","lock","applySidebar","watchNavigationLayer","Map","label","input","htmlFor","set","applyNavigationLayer","mountTableOfContents","tablet$","tablet","sidebar$","anchors$","anchors","watchAnchorList","decodeURIComponent","target","adjust$","header","path","anchor","pop","a","b","applyAnchorList","forEach","mountSearch","query$","reset$","result$","defaultTransform","trim","mountSearchQuery","options","fn","transform","delay","distinctUntilChanged","watchSearchQuery","QUERY","mountSearchReset","watchSearchReset","addToSearchResultList","applySearchResult","fetch$","list","meta","setSearchResultMeta","resetSearchResultMeta","animationFrame","scan","container","scrollHeight","finalize","resetSearchResultList","mountSearchResult","identity","mountHeader","styles","getComputedStyle","includes","position","sticky","watchHeader","type$","main","hx","setHeaderTitleActive","resetHeaderTitleActive","applyHeaderType","mountHero","hidden","setHeroHidden","resetHeroHidden","applyHero","mountMain","active","setHeaderShadow","resetHeaderShadow","marker$","bottom","active$","watchMain","mountTabs","setTabsHidden","resetTabsHidden","applyTabs","isAppleDevice","navigator","userAgent","fetchSourceFacts","toLowerCase","user","repo","status","stargazers_count","forks_count","public_repos","fetchSourceFactsFromGitHub","project","encodeURIComponent","star_count","fetchSourceFactsFromGitLab","setScrollLock","resetScrollLock","parseInt","initialize","SyntaxError","hash$","features","search$","navigation$","toc$","tabs$","hero$","keyboard$","indexOf","setupKeyboard","els$","details","closest","open","scrollIntoView","patchDetails","src","script","patchScripts","hasAttribute","patchSource","sentinel","patchTables","iif","patchScrollfix","dialog$","duration","dialog","add","body","setupDialog","clipboard$","block","parent","insertBefore","on","clearSelection","setupClipboard","link$","scrollRestoration","state$","push$","pop$","state","debounceTime","replaceState","bufferCount","instant$","sample","head","dispatchEvent","CustomEvent","setupInstantLoading","visibility","values","documentElement","match"],"mappings":"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","file":"assets/javascripts/bundle.546b0e0d.min.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t0: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([85,1]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { BehaviorSubject } from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve location\n *\n * This function will return a `URL` object (and not `Location`) in order to\n * normalize typings across the application. Furthermore, locations need to be\n * tracked without setting them and `Location` is a singleton which represents\n * the current location.\n *\n * @return URL\n */\nexport function getLocation(): URL {\n return new URL(location.href)\n}\n\n/**\n * Set location\n *\n * @param url - URL to change to\n */\nexport function setLocation(url: URL): void {\n location.href = url.href\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Check whether a URL is an internal link or a file (except `.html`)\n *\n * @param url - URL or HTML anchor element\n * @param ref - Reference URL\n *\n * @return Test result\n */\nexport function isLocationInternal(\n url: URL | HTMLAnchorElement,\n ref: URL | Location = location\n): boolean {\n return url.host === ref.host\n && /^(?:\\/[\\w-]+)*(?:\\/?|\\.html)$/i.test(url.pathname)\n}\n\n/**\n * Check whether a URL is an anchor link on the current page\n *\n * @param url - URL or HTML anchor element\n * @param ref - Reference URL\n *\n * @return Test result\n */\nexport function isLocationAnchor(\n url: URL | HTMLAnchorElement,\n ref: URL | Location = location\n): boolean {\n return url.pathname === ref.pathname\n && url.hash.length > 0\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch location\n *\n * @return Location subject\n */\nexport function watchLocation(): BehaviorSubject {\n return new BehaviorSubject(getLocation())\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent } from \"rxjs\"\nimport { filter, map, share, startWith } from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve location hash\n *\n * @return Location hash\n */\nexport function getLocationHash(): string {\n return location.hash.substring(1)\n}\n\n/**\n * Set location hash\n *\n * Setting a new fragment identifier via `location.hash` will have no effect\n * if the value doesn't change. However, when a new fragment identifier is set,\n * we want the browser to target the respective element at all times, which is\n * why we use this dirty little trick.\n *\n * @param hash - Location hash\n */\nexport function setLocationHash(hash: string): void {\n const el = document.createElement(\"a\")\n el.href = hash\n el.click()\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch location hash\n *\n * @return Location hash observable\n */\nexport function watchLocationHash(): Observable {\n return fromEvent(window, \"hashchange\")\n .pipe(\n map(getLocationHash),\n startWith(getLocationHash()),\n filter(hash => hash.length > 0),\n share()\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { NEVER, Observable } from \"rxjs\"\nimport { ajax } from \"rxjs/ajax\"\nimport {\n catchError,\n distinctUntilKeyChanged,\n map,\n share,\n skip,\n switchMap\n} from \"rxjs/operators\"\n\nimport { setLocation } from \"../../location\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n location$: Observable /* Location observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch document switch\n *\n * This function returns an observables that fetches a document if the provided\n * location observable emits a new value (i.e. URL). If the emitted URL points\n * to the same page, the request is effectively ignored (i.e. when only the\n * fragment identifier changes).\n *\n * Theoretically, we could use `responseType: \"document\"`, but since all MkDocs\n * links are relative, we need to make sure that the current location matches\n * the document we just loaded. Otherwise any relative links in the document\n * may use the old location.\n *\n * @param options - Options\n *\n * @return Document observable\n */\nexport function watchDocumentSwitch(\n { location$ }: WatchOptions\n): Observable {\n const dom = new DOMParser()\n return location$\n .pipe(\n distinctUntilKeyChanged(\"pathname\"),\n skip(1),\n\n /* Fetch document */\n switchMap(url => ajax({\n url: url.href,\n responseType: \"text\",\n withCredentials: true\n })\n .pipe(\n map(({ response }): Document => {\n history.pushState({}, \"\", url.toString()) // TODO: abstract into function\n return dom.parseFromString(response, \"text/html\")\n }),\n catchError(() => {\n setLocation(url)\n return NEVER\n })\n )\n ),\n share()\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { NEVER, Observable, fromEvent, merge } from \"rxjs\"\nimport { mapTo, shareReplay } from \"rxjs/operators\"\n\nimport { watchDocumentSwitch } from \"../switch\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n location$?: Observable /* Location observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch document\n *\n * If the location observable is passed, instant loading will be enabled which\n * means that new values will be emitted every time the location changes.\n *\n * @return Document observable\n */\nexport function watchDocument(\n { location$ }: WatchOptions = {}\n): Observable {\n return merge(\n fromEvent(document, \"DOMContentLoaded\")\n .pipe(\n mapTo(document)\n ),\n typeof location$ !== \"undefined\"\n ? watchDocumentSwitch({ location$ })\n : NEVER\n )\n .pipe(\n shareReplay(1)\n )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve an element matching the query selector\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @return Element or nothing\n */\nexport function getElement