{"version":3,"sources":["webpack:///webpack/bootstrap","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/location/_/index.ts","webpack:///./src/assets/javascripts/browser/location/base/index.ts","webpack:///./src/assets/javascripts/browser/location/hash/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/integrations/clipboard/index.ts","webpack:///./src/assets/javascripts/integrations/dialog/index.ts","webpack:///./src/assets/javascripts/integrations/instant/index.ts","webpack:///./src/assets/javascripts/integrations/keyboard/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/shared/sidebar/set/index.ts","webpack:///./src/assets/javascripts/components/toc/anchor/index.ts","webpack:///./src/assets/javascripts/integrations/search/_/index.ts","webpack:///./src/assets/javascripts/integrations/search/document/index.ts","webpack:///./src/assets/javascripts/integrations/search/highlighter/index.ts","webpack:///./src/assets/javascripts/integrations/search/transform/index.ts","webpack:///./src/assets/javascripts/integrations/search/worker/message/index.ts","webpack:///./src/assets/javascripts/integrations/search/worker/_/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/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/_/index.ts","webpack:///./src/assets/javascripts/components/search/query/react/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/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/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/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/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/components/navigation/_/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/patches/code/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"],"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","watchDocument","document$","ReplaySubject","fromEvent","document","pipe","mapTo","subscribe","getElement","selector","node","querySelector","undefined","getElementOrThrow","el","ReferenceError","getActiveElement","activeElement","HTMLElement","getElements","Array","from","querySelectorAll","createElement","tagName","replaceElement","source","target","replaceWith","setElementFocus","focus","blur","watchElementFocus","merge","map","startWith","shareReplay","getElementOffset","x","scrollLeft","y","scrollTop","watchElementOffset","setElementSelection","HTMLInputElement","Error","select","watchElementSize","fromEventPattern","next","contentRect","width","Math","round","height","observe","offsetWidth","offsetHeight","getElementSize","isSusceptibleToKeyboard","isContentEditable","watchKeyboard","filter","ev","metaKey","ctrlKey","type","claim","preventDefault","stopPropagation","share","setLocation","url","location","href","isLocalLocation","ref","host","test","pathname","isAnchorLocation","hash","watchLocation","BehaviorSubject","URL","watchLocationBase","base","take","toString","replace","getLocationHash","substring","setLocationHash","addEventListener","click","watchLocationHash","watchMedia","query","media","matchMedia","addListener","matches","toggles","drawer","search","getToggle","checked","setToggle","watchToggle","getViewportOffset","max","pageXOffset","pageYOffset","setViewportOffset","scrollTo","getViewportSize","innerWidth","innerHeight","watchViewport","combineLatest","passive","offset","size","watchViewportAt","header$","viewport$","size$","distinctUntilKeyChanged","offset$","offsetLeft","offsetTop","watchWorker","worker","tx$","rx$","pluck","throttle","leading","trailing","tap","message","postMessage","switchMapTo","isConfig","config","features","createElementNS","setAttribute","setAttributeNS","appendChild","child","innerHTML","Node","isArray","h","attributes","keys","attr","children","cache","factory","defer","sessionStorage","getItem","of","JSON","parse","value$","setItem","stringify","err","lang","translate","textContent","truncate","toFixed","len","charCodeAt","setupClipboard","dialog$","forEach","block","index","parent","parentElement","id","insertBefore","clipboard$","on","clearSelection","setupDialog","duration","Subject","dialog","classList","add","switchMap","text","body","container","observeOn","animationFrame","delay","removeAttribute","remove","setupInstantLoading","urls","location$","history","scrollRestoration","favicon","state$","closest","includes","push$","pop$","state","distinctUntilChanged","prev","ajax$","skip","ajax","responseType","withCredentials","catchError","sample","pushState","dom","DOMParser","response","parseFromString","instant$","withLatestFrom","title","head","dispatchEvent","CustomEvent","debounceTime","replaceState","bufferCount","setupKeyboard","keyboard$","active","els","indexOf","components$","setupComponents","names","reduce","components","useComponent","setAnchorBlur","resetAnchorBlur","setAnchorActive","toggle","resetAnchorActive","css","renderClipboardButton","class","xmlns","viewBox","renderSearchResult","article","sections","icon","tabIndex","renderSource","facts","fact","renderTable","table","setSidebarOffset","style","top","resetSidebarOffset","setSidebarHeight","resetSidebarHeight","docs","pipeline","this","documents","Map","doc","split","path","linked","set","setupSearchDocumentMap","highlight","separator","RegExp","_","term","trim","match","setupSearchHighlighter","lunr","tokenizer","use","multiLanguage","fns","a","b","Set","has","difference","language","fn","searchPipeline","field","boost","Index","load","groups","results","section","console","warn","defaultTransform","terms","join","SearchMessageType","isSearchReadyMessage","READY","isSearchQueryMessage","QUERY","isSearchResultMessage","RESULT","setupSearchIndex","identity","setupSearchWorker","index$","base$","Worker","SETUP","watchSidebar","main$","adjust","min","lock","applySidebar","mountTableOfContents","tablet$","tablet","sidebar$","anchors$","sidebar","anchors","watchAnchorList","decodeURIComponent","adjust$","header","anchor","pop","applyAnchorList","mountSearch","query$","reset$","result$","status$","status","mountSearchQuery","options","focus$","watchSearchQuery","mountSearchReset","watchSearchReset","addToSearchResultList","applySearchResult","ready$","fetch$","list","meta","setSearchResultMeta","resetSearchResultMeta","scan","scrollHeight","finalize","resetSearchResultList","mountSearchResult","mountMain","setHeaderShadow","resetHeaderShadow","border$","bottom","watchMain","main","mountHero","hidden","setHeroHidden","resetHeroHidden","applyHero","mountHeader","styles","getComputedStyle","position","sticky","watchHeader","type$","hx","setHeaderTitleActive","resetHeaderTitleActive","applyHeaderType","mountTabs","screen$","screen","setTabsHidden","resetTabsHidden","applyTabs","mountNavigation","isAppleDevice","navigator","userAgent","fetchSourceFacts","toLowerCase","user","repo","stargazers_count","forks_count","public_repos","fetchSourceFactsFromGitHub","project","encodeURIComponent","star_count","fetchSourceFactsFromGitLab","setScrollLock","resetScrollLock","parseInt","initialize","SyntaxError","hash$","els$","scrollWidth","clientWidth","patchCodeBlocks","details","open","scrollIntoView","patchDetails","src","script","hasAttribute","patchSource","sentinel","patchTables","iif","patchScrollfix","navigation$","toc$","tabs$","hero$","search$","transform","protocol","sortBy","prop","charAt","visibility","values","documentElement"],"mappings":"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","file":"assets/javascripts/bundle.b39636ac.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([88,1]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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 { ReplaySubject, Subject, fromEvent } from \"rxjs\"\nimport { mapTo } from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch document\n *\n * Documents must be implemented as subjects, so all downstream observables are\n * automatically updated when a new document is emitted. This enabled features\n * like instant loading.\n *\n * @return Document subject\n */\nexport function watchDocument(): Subject<Document> {\n  const document$ = new ReplaySubject<Document>()\n  fromEvent(document, \"DOMContentLoaded\")\n    .pipe(\n      mapTo(document)\n    )\n      .subscribe(document$)\n\n  /* Return document */\n  return document$\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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<T extends HTMLElement>(\n  selector: string, node: ParentNode = document\n): T | undefined {\n  return node.querySelector<T>(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<T extends HTMLElement>(\n  selector: string, node: ParentNode = document\n): T {\n  const el = getElement<T>(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<T extends HTMLElement>(\n  selector: string, node: ParentNode = document\n): T[] {\n  return Array.from(node.querySelectorAll<T>(selector))\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Create an element\n *\n * @template T - Tag name type\n *\n * @param tagName - Tag name\n *\n * @return Element\n */\nexport function createElement<\n  T extends keyof HTMLElementTagNameMap\n>(tagName: T): HTMLElementTagNameMap[T] {\n  return document.createElement(tagName)\n}\n\n/**\n * Replace an element with another element\n *\n * @param source - Source element\n * @param target - Target element\n */\nexport function replaceElement(\n  source: HTMLElement, target: Node\n): void {\n  source.replaceWith(target)\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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\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<boolean> {\n  return merge(\n    fromEvent<FocusEvent>(el, \"focus\"),\n    fromEvent<FocusEvent>(el, \"blur\")\n  )\n    .pipe(\n      map(({ type }) => type === \"focus\"),\n      startWith(el === getActiveElement()),\n      shareReplay(1)\n    )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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<ElementOffset> {\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 <martin.donath@squidfunk.com>\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 <martin.donath@squidfunk.com>\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<ElementSize> {\n  return fromEventPattern<ElementSize>(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 <martin.donath@squidfunk.com>\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<Key> {\n  return fromEvent<KeyboardEvent>(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 <martin.donath@squidfunk.com>\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, Subject } 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 a local 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 isLocalLocation(\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 isAnchorLocation(\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(): Subject<URL> {\n  return new BehaviorSubject<URL>(getLocation())\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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, shareReplay, take } from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n  location$: Observable<URL>           /* Location observable */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch location base\n *\n * @return Location base observable\n */\nexport function watchLocationBase(\n  base: string, { location$ }: WatchOptions\n): Observable<string> {\n  return location$\n    .pipe(\n      take(1),\n      map(({ href }) => new URL(base, href)\n        .toString()\n        .replace(/\\/$/, \"\")\n      ),\n      shareReplay(1)\n    )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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\nimport { createElement } from \"browser\"\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. When a new fragment identifier is set, we want\n * the browser to target the respective element at all times, which is why we\n * use this dirty little trick.\n *\n * @param hash - Location hash\n */\nexport function setLocationHash(hash: string): void {\n  const el = createElement(\"a\")\n  el.href = hash\n  el.addEventListener(\"click\", ev => ev.stopPropagation())\n  el.click()\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch location hash\n *\n * @return Location hash observable\n */\nexport function watchLocationHash(): Observable<string> {\n  return fromEvent<HashChangeEvent>(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 <martin.donath@squidfunk.com>\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<boolean> {\n  const media = matchMedia(query)\n  return fromEventPattern<boolean>(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 <martin.donath@squidfunk.com>\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<Toggle, HTMLInputElement> = {\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<boolean> {\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 <martin.donath@squidfunk.com>\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<ViewportOffset>\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<ViewportOffset> {\n  return merge(\n    fromEvent(window, \"scroll\", { passive: true }),\n    fromEvent(window, \"resize\", { passive: true })\n  )\n    .pipe(\n      map(getViewportOffset),\n      startWith(getViewportOffset())\n    )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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<ViewportSize> {\n  return fromEvent(window, \"resize\", { passive: true })\n    .pipe(\n      map(getViewportSize),\n      startWith(getViewportSize())\n    )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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>          /* Header observable */\n  viewport$: Observable<Viewport>      /* Viewport observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport\n *\n * @return Viewport observable\n */\nexport function watchViewport(): Observable<Viewport> {\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<Viewport> {\n  const size$ = viewport$\n    .pipe(\n      distinctUntilKeyChanged(\"size\")\n    )\n\n  /* Compute element offset */\n  const offset$ = combineLatest([size$, header$])\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 <martin.donath@squidfunk.com>\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<T>                      /* Message transmission subject */\n  rx$: Observable<T>                   /* 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<T extends WorkerMessage> {\n  tx$: Observable<T>                   /* 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<T extends WorkerMessage>(\n  worker: Worker, { tx$ }: WatchOptions<T>\n): Observable<T> {\n\n  /* Intercept messages from worker-like objects */\n  const rx$ = fromEventPattern<MessageEvent>(next =>\n    worker.addEventListener(\"message\", next)\n  )\n    .pipe<T>(\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 <martin.donath@squidfunk.com>\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 { SearchIndex, SearchTransformFn } from \"integrations\"\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 * Configuration\n */\nexport interface Config {\n  base: string                         /* Base URL */\n  features: Feature[]                  /* Feature flags */\n  search: {\n    worker: string                     /* Worker URL */\n    index?: Promise<SearchIndex>       /* Promise resolving with index */\n    transform?: SearchTransformFn      /* Transformation function */\n  }\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.base === \"string\"\n      && typeof config.features === \"object\"\n      && typeof config.search === \"object\"\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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<string, any>\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 tagName - HTML or SVG tag\n *\n * @return Element\n */\nfunction createElement(tagName: string): HTMLElement | SVGElement {\n  switch (tagName) {\n\n    /* SVG elements */\n    case \"svg\":\n    case \"path\":\n      return document.createElementNS(\"http://www.w3.org/2000/svg\", tagName)\n\n    /* HTML elements */\n    default:\n      return document.createElement(tagName)\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 tagName - HTML or SVG tag\n * @param attributes - HTML attributes\n * @param children - Child elements\n *\n * @return Element\n */\nexport function h(\n  tagName: string, attributes: Attributes | null, ...children: Child[]\n): HTMLElement | SVGElement {\n  const el = createElement(tagName)\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 <martin.donath@squidfunk.com>\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<T>(\n  key: string, factory: () => Observable<T>\n): Observable<T> {\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 <martin.donath@squidfunk.com>\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<string, string>\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 + 0.000001) / 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 <martin.donath@squidfunk.com>\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 <martin.donath@squidfunk.com>\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 { renderClipboardButton } from \"templates\"\nimport { translate } from \"utilities\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup options\n */\ninterface SetupOptions {\n  document$: Observable<Document>      /* Document observable */\n  dialog$: Subject<string>             /* Dialog subject */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up 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<ClipboardJS.Event> {\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(renderClipboardButton(parent.id), block)\n    })\n  })\n\n  /* Initialize clipboard */\n  const clipboard$ = fromEventPattern<ClipboardJS.Event>(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 <martin.donath@squidfunk.com>\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\nimport { createElement } from \"browser\"\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 * Set up dialog\n *\n * @param options - Options\n *\n * @return Dialog observable\n */\nexport function setupDialog(\n  { duration }: SetupOptions = {}\n): Subject<string> {\n  const dialog$ = new Subject<string>()\n\n  /* Create dialog */\n  const dialog = 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 */\n  return dialog$\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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, Subject, fromEvent, merge, of } from \"rxjs\"\nimport { ajax } from \"rxjs//ajax\"\nimport {\n  bufferCount,\n  catchError,\n  debounceTime,\n  distinctUntilChanged,\n  distinctUntilKeyChanged,\n  filter,\n  map,\n  pluck,\n  sample,\n  share,\n  skip,\n  switchMap,\n  withLatestFrom\n} from \"rxjs/operators\"\n\nimport {\n  Viewport,\n  ViewportOffset,\n  getElement,\n  isAnchorLocation,\n  isLocalLocation,\n  replaceElement,\n  setLocation,\n  setLocationHash,\n  setToggle,\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$: Subject<Document>         /* Document subject */\n  location$: Subject<URL>              /* Location subject */\n  viewport$: Observable<Viewport>      /* Viewport observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up instant loading\n *\n * When fetching, theoretically, we could use `responseType: \"document\"`, but\n * since all MkDocs links are relative, we need to make sure that the current\n * location matches the document we just loaded. Otherwise any relative links\n * in the document could use the old location.\n *\n * This is the reason why we need to synchronize history events and the process\n * of fetching the document for navigation changes (except `popstate` events):\n *\n * 1. Fetch document via `XMLHTTPRequest`\n * 2. Set new location via `history.pushState`\n * 3. Parse and emit fetched document\n *\n * For `popstate` events, we must not use `history.pushState`, or the forward\n * history will be irreversibly overwritten. In case the request fails, the\n * location change is dispatched regularly.\n *\n * @param options - Options\n */\nexport function setupInstantLoading(\n  urls: string[], { document$, viewport$, location$ }: SetupOptions\n): void {\n\n  /* Disable automatic scroll restoration */\n  if (\"scrollRestoration\" in history)\n    history.scrollRestoration = \"manual\"\n\n  /* Hack: ensure that reloads restore viewport offset */\n  fromEvent(window, \"beforeunload\")\n    .subscribe(() => {\n      history.scrollRestoration = \"auto\"\n    })\n\n  /* Hack: ensure absolute favicon link to omit 404s on document switch */\n  const favicon = getElement<HTMLLinkElement>(`link[rel=\"shortcut icon\"]`)\n  if (typeof favicon !== \"undefined\")\n    favicon.href = favicon.href // tslint:disable-line no-self-assignment\n\n  /* Intercept link clicks and convert to state change */\n  const state$ = fromEvent<MouseEvent>(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\")\n          if (\n            el && !el.target &&\n            isLocalLocation(el) &&\n            urls.includes(el.href)\n          ) {\n            if (!isAnchorLocation(el))\n              ev.preventDefault()\n            return of(el)\n          }\n        }\n        return NEVER\n      }),\n      map(el => ({ url: new URL(el.href) })),\n      share<State>()\n    )\n\n  /* Always close search on link click */\n  state$.subscribe(() => {\n    setToggle(\"search\", false)\n  })\n\n  /* Filter state changes to dispatch */\n  const push$ = state$\n    .pipe(\n      filter(({ url }) => !isAnchorLocation(url)),\n      share()\n    )\n\n  /* Intercept popstate events (history back and forward) */\n  const pop$ = fromEvent<PopStateEvent>(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<State>()\n    )\n\n  /* Emit location change */\n  merge(push$, pop$)\n    .pipe(\n      distinctUntilChanged((prev, next) => prev.url.href === next.url.href),\n      pluck(\"url\")\n    )\n      .subscribe(location$)\n\n  /* Fetch document on location change */\n  const ajax$ = location$\n    .pipe(\n      distinctUntilKeyChanged(\"pathname\"),\n      skip(1),\n      switchMap(url => ajax({\n        url: url.href,\n        responseType: \"text\",\n        withCredentials: true\n      })\n        .pipe(\n          catchError(() => {\n            setLocation(url)\n            return NEVER\n          })\n        )\n      )\n    )\n\n  /* Set new location as soon as the document was fetched */\n  push$\n    .pipe(\n      sample(ajax$)\n    )\n      .subscribe(({ url }) => {\n        history.pushState({}, \"\", url.toString())\n      })\n\n  /* Parse and emit document */\n  const dom = new DOMParser()\n  ajax$\n    .pipe(\n      map(({ response }) => dom.parseFromString(response, \"text/html\"))\n    )\n      .subscribe(document$)\n\n  /* Intercept instant loading */\n  const instant$ = merge(push$, pop$)\n    .pipe(\n      sample(document$)\n    )\n\n  // TODO: this must be combined with search scroll restoration on mobile\n  instant$.subscribe(({ url, offset }) => {\n    if (url.hash && !offset) {\n      setLocationHash(url.hash)\n    } else {\n      setViewportOffset(offset || { y: 0 })\n    }\n  })\n\n  /* Replace document metadata */\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            replaceElement(prev, next)\n          }\n        }\n      })\n\n  /* 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  /* Set 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            && !isAnchorLocation(next.url)\n      }),\n      map(([, state]) => state)\n    )\n      .subscribe(({ offset }) => {\n        setViewportOffset(offset || { y: 0 })\n      })\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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 * Set up keyboard\n *\n * This function will set up 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<Keyboard> {\n  const keyboard$ = watchKeyboard()\n    .pipe(\n      map<Key, Keyboard>(key => ({\n        mode: getToggle(\"search\") ? \"search\" : \"global\",\n        ...key\n      })),\n      filter(({ mode }) => {\n        if (mode === \"global\") {\n          const active = getActiveElement()\n          if (typeof active !== \"undefined\")\n            return !isSusceptibleToKeyboard(active)\n        }\n        return true\n      }),\n      share()\n    )\n\n  /* Set up 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  /* Set up global keyboard handlers */\n  keyboard$\n    .pipe(\n      filter(({ mode }) => mode === \"global\"),\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 <martin.donath@squidfunk.com>\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, replaceElement } from \"browser\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Component\n */\nexport type Component =\n  | \"announce\"                         /* Announcement bar */\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>      /* Document observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Component map observable\n */\nlet components$: Observable<ComponentMap>\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up 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<ComponentMap>((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 \"announce\":\n            case \"header-title\":\n            case \"container\":\n            case \"skip\":\n              if (name in prev && typeof prev[name] !== \"undefined\") {\n                replaceElement(prev[name]!, 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 Component observable\n */\nexport function useComponent<T extends HTMLInputElement>(\n  name: \"search-query\"\n): Observable<T>\nexport function useComponent<T extends HTMLElement>(\n  name: Component\n): Observable<T>\nexport function useComponent<T extends HTMLElement>(\n  name: Component\n): Observable<T> {\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 <martin.donath@squidfunk.com>\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 <martin.donath@squidfunk.com>\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 <martin.donath@squidfunk.com>\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 renderClipboardButton(\n  id: string\n) {\n  return (\n    <button\n      class={css.container}\n      title={translate(\"clipboard.copy\")}\n      data-clipboard-target={`#${id} > code`}\n    >\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n        <path d={path}></path>\n      </svg>\n    </button>\n  )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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    <div class=\"md-search-result__icon md-icon\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n        <path d={path}></path>\n      </svg>\n    </div>\n  )\n\n  /* Render article and sections */\n  const children = [article, ...sections].map(document => {\n    const { location, title, text } = document\n    return (\n      <a href={location} class={css.link} tabIndex={-1}>\n        <article class={\"parent\" in document ? css.section : css.article}>\n          {!(\"parent\" in document) && icon}\n          <h1 class={css.title}>{title}</h1>\n          {text.length > 0 && <p class={css.teaser}>{truncate(text, 320)}</p>}\n        </article>\n      </a>\n    )\n  })\n\n  /* Render search result */\n  return (\n    <li class={css.item}>\n      {children}\n    </li>\n  )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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    <li class={css.fact}>{fact}</li>\n  ))\n  return (\n    <ul class={css.facts}>\n      {children}\n    </ul>\n  )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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    <div class={css.wrapper}>\n      <div class={css.table}>\n        {table}\n      </div>\n    </div>\n  )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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 * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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 <martin.donath@squidfunk.com>\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  ArticleDocument,\n  SearchDocumentMap,\n  SectionDocument,\n  setupSearchDocumentMap\n} from \"../document\"\nimport {\n  SearchHighlightFactoryFn,\n  setupSearchHighlighter\n} from \"../highlighter\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search index configuration\n */\nexport interface SearchIndexConfig {\n  lang: string[]                       /* Search languages */\n  separator: string                    /* Search separator */\n}\n\n/**\n * Search index document\n */\nexport interface SearchIndexDocument {\n  location: string                     /* Document location */\n  title: string                        /* Document title */\n  text: string                         /* Document text */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search index pipeline function\n */\nexport type SearchIndexPipelineFn =\n  | \"trimmer\"                          /* Trimmer */\n  | \"stopWordFilter\"                   /* Stop word filter */\n  | \"stemmer\"                          /* Stemmer */\n\n/**\n * Search index pipeline\n */\nexport type SearchIndexPipeline = SearchIndexPipelineFn[]\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search index\n *\n * This interfaces describes the format of the `search_index.json` file which\n * is automatically built by the MkDocs search plugin.\n */\nexport interface SearchIndex {\n  config: SearchIndexConfig            /* Search index configuration */\n  docs: SearchIndexDocument[]          /* Search index documents */\n  index?: object | string              /* Prebuilt or serialized index */\n  pipeline?: SearchIndexPipeline       /* Search index pipeline */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search result\n */\nexport interface SearchResult {\n  article: ArticleDocument             /* Article document */\n  sections: SectionDocument[]          /* Section documents */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Compute the difference of two lists of strings\n *\n * @param a - 1st list of strings\n * @param b - 2nd list of strings\n *\n * @return Difference\n */\nfunction difference(a: string[], b: string[]): string[] {\n  const [x, y] = [new Set(a), new Set(b)]\n  return [\n    ...new Set([...x].filter(value => !y.has(value)))\n  ]\n}\n\n/* ----------------------------------------------------------------------------\n * Class\n * ------------------------------------------------------------------------- */\n\n/**\n * Search\n *\n * Note that `lunr` is injected via Webpack, as it will otherwise also be\n * bundled in the application bundle.\n */\nexport class Search {\n\n  /**\n   * Search document mapping\n   *\n   * A mapping of URLs (including hash fragments) to the actual articles and\n   * sections of the documentation. The search document mapping must be created\n   * regardless of whether the index was prebuilt or not, as `lunr` itself will\n   * only store the actual index.\n   */\n  protected documents: SearchDocumentMap\n\n  /**\n   * Search highlight factory function\n   */\n  protected highlight: SearchHighlightFactoryFn\n\n  /**\n   * The `lunr` search index\n   */\n  protected index: lunr.Index\n\n  /**\n   * Create the search integration\n   *\n   * @param data - Search index\n   */\n  public constructor({ config, docs, pipeline, index }: SearchIndex) {\n    this.documents = setupSearchDocumentMap(docs)\n    this.highlight = setupSearchHighlighter(config)\n\n    /* Set separator for tokenizer */\n    lunr.tokenizer.separator = new RegExp(config.separator)\n\n    /* If no index was given, create it */\n    if (typeof index === \"undefined\") {\n      this.index = lunr(function() {\n\n        /* Set up alternate search languages */\n        if (config.lang.length === 1 && config.lang[0] !== \"en\") {\n          this.use((lunr as any)[config.lang[0]])\n        } else if (config.lang.length > 1) {\n          this.use((lunr as any).multiLanguage(...config.lang))\n        }\n\n        /* Compute functions to be removed from the pipeline */\n        const fns = difference([\n          \"trimmer\", \"stopWordFilter\", \"stemmer\"\n        ], pipeline!)\n\n        /* Remove functions from the pipeline for every language */\n        for (const lang of config.lang.map(language => (\n          language === \"en\" ? lunr : (lunr as any)[language]\n        ))) {\n          for (const fn of fns) {\n            this.pipeline.remove(lang[fn])\n            this.searchPipeline.remove(lang[fn])\n          }\n        }\n\n        /* Set up fields and reference */\n        this.field(\"title\", { boost: 1000 })\n        this.field(\"text\")\n        this.ref(\"location\")\n\n        /* Index documents */\n        for (const doc of docs)\n          this.add(doc)\n      })\n\n    /* Prebuilt or serialized index */\n    } else {\n      this.index = lunr.Index.load(\n        typeof index === \"string\"\n          ? JSON.parse(index)\n          : index\n      )\n    }\n  }\n\n  /**\n   * Search for matching documents\n   *\n   * The search index which MkDocs provides is divided up into articles, which\n   * contain the whole content of the individual pages, and sections, which only\n   * contain the contents of the subsections obtained by breaking the individual\n   * pages up at `h1` ... `h6`. As there may be many sections on different pages\n   * with identical titles (for example within this very project, e.g. \"Usage\"\n   * or \"Installation\"), they need to be put into the context of the containing\n   * page. For this reason, section results are grouped within their respective\n   * articles which are the top-level results that are returned.\n   *\n   * @param value - Query value\n   *\n   * @return Search results\n   */\n  public query(value: string): SearchResult[] {\n    if (value) {\n      try {\n\n        /* Group sections by containing article */\n        const groups = this.index.search(value)\n          .reduce((results, result) => {\n            const document = this.documents.get(result.ref)\n            if (typeof document !== \"undefined\") {\n              if (\"parent\" in document) {\n                const ref = document.parent.location\n                results.set(ref, [...results.get(ref) || [], result])\n              } else {\n                const ref = document.location\n                results.set(ref, results.get(ref) || [])\n              }\n            }\n            return results\n          }, new Map<string, lunr.Index.Result[]>())\n\n        /* Create highlighter for query */\n        const fn = this.highlight(value)\n\n        /* Map groups to search documents */\n        return [...groups].map(([ref, sections]) => ({\n          article: fn(this.documents.get(ref) as ArticleDocument),\n          sections: sections.map(section => {\n            return fn(this.documents.get(section.ref) as SectionDocument)\n          })\n        }))\n\n      /* Log errors to console (for now) */\n      } catch (err) {\n        // tslint:disable-next-line no-console\n        console.warn(`Invalid query: ${value} – see https://bit.ly/2s3ChXG`)\n      }\n    }\n\n    /* Return nothing in case of error or empty query */\n    return []\n  }\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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 escapeHTML from \"escape-html\"\n\nimport { SearchIndexDocument } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * A top-level article\n */\nexport interface ArticleDocument extends SearchIndexDocument {\n  linked: boolean                      /* Whether the section was linked */\n}\n\n/**\n * A section of an article\n */\nexport interface SectionDocument extends SearchIndexDocument {\n  parent: ArticleDocument              /* Parent article */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search document\n */\nexport type SearchDocument =\n  | ArticleDocument\n  | SectionDocument\n\n/**\n * Search document mapping\n */\nexport type SearchDocumentMap = Map<string, SearchDocument>\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create a search document mapping\n *\n * @param docs - Search index documents\n *\n * @return Search document map\n */\nexport function setupSearchDocumentMap(\n  docs: SearchIndexDocument[]\n): SearchDocumentMap {\n  const documents = new Map<string, SearchDocument>()\n  for (const doc of docs) {\n    const [path, hash] = doc.location.split(\"#\")\n\n    /* Extract location and title */\n    const location = doc.location\n    const title    = doc.title\n\n    /* Escape and cleanup text */\n    const text = escapeHTML(doc.text)\n      .replace(/\\s+(?=[,.:;!?])/g, \"\")\n      .replace(/\\s+/g, \" \")\n\n    /* Handle section */\n    if (hash) {\n      const parent = documents.get(path) as ArticleDocument\n\n      /* Ignore first section, override article */\n      if (!parent.linked) {\n        parent.title  = doc.title\n        parent.text   = text\n        parent.linked = true\n\n      /* Add subsequent section */\n      } else {\n        documents.set(location, {\n          location,\n          title,\n          text,\n          parent\n        })\n      }\n\n    /* Add article */\n    } else {\n      documents.set(location, {\n        location,\n        title,\n        text,\n        linked: false\n      })\n    }\n  }\n  return documents\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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 } from \"../_\"\nimport { SearchDocument } from \"../document\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search highlight function\n *\n * @template T - Search document type\n *\n * @param document - Search document\n *\n * @return Highlighted document\n */\nexport type SearchHighlightFn = <\n  T extends SearchDocument\n>(document: Readonly<T>) => T\n\n/**\n * Search highlight factory function\n *\n * @param value - Query value\n *\n * @return Search highlight function\n */\nexport type SearchHighlightFactoryFn = (value: string) => SearchHighlightFn\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create a search highlighter\n *\n * @param config - Search index configuration\n *\n * @return Search highlight factory function\n */\nexport function setupSearchHighlighter(\n  config: SearchIndexConfig\n): SearchHighlightFactoryFn {\n  const separator = new RegExp(config.separator, \"img\")\n  const highlight = (_: unknown, data: string, term: string) => {\n    return `${data}<em>${term}</em>`\n  }\n\n  /* Return factory function */\n  return (value: string) => {\n    value = value\n      .replace(/[\\s*+\\-:~^]+/g, \" \")\n      .trim()\n\n    /* Create search term match expression */\n    const match = new RegExp(`(^|${config.separator})(${\n      value\n        .replace(/[|\\\\{}()[\\]^$+*?.-]/g, \"\\\\$&\")\n        .replace(separator, \"|\")\n    })`, \"img\")\n\n    /* Highlight document */\n    return document => ({\n      ...document,\n      title: document.title.replace(match, highlight),\n      text:  document.text.replace(match, highlight)\n    })\n  }\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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 * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search transformation function\n *\n * @param value - Query value\n *\n * @return Transformed query value\n */\nexport type SearchTransformFn = (value: string) => string\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Default transformation function\n *\n * 1. Search for terms in quotation marks and prepend a `+` modifier to denote\n *    that the resulting document must contain all terms, converting the query\n *    to an `AND` query (as opposed to the default `OR` behavior). While users\n *    may expect terms enclosed in quotation marks to map to span queries, i.e.\n *    for which order is important, `lunr` doesn't support them, so the best\n *    we can do is to convert the terms to an `AND` query.\n *\n * 2. Replace control characters which are not located at the beginning of the\n *    query or preceded by white space, or are not followed by a non-whitespace\n *    character or are at the end of the query string. Furthermore, filter\n *    unmatched quotation marks.\n *\n * 3. Trim excess whitespace from left and right.\n *\n * 4. Append a wildcard to the end of every word to make every word a prefix\n *    query in order to provide a good type-ahead experience, by adding an\n *    asterisk (wildcard) in between terms, which can be denoted by whitespace,\n *    any non-control character, or a word boundary.\n *\n * @param value - Query value\n *\n * @return Transformed query value\n */\nexport function defaultTransform(value: string): string {\n  return value\n    .split(/\"([^\"]+)\"/g)                            /* => 1 */\n      .map((terms, i) => i & 1\n        ? terms.replace(/^\\b|^(?![^\\x00-\\x7F]|$)|\\s+/g, \" +\")\n        : terms\n      )\n      .join(\"\")\n    .replace(/\"|(?:^|\\s+)[*+\\-:^~]+(?=\\s+|$)/g, \"\") /* => 2 */\n    .trim()                                         /* => 3 */\n    .replace(/\\s+|(?![^\\x00-\\x7F]|^)$|\\b$/g, \"* \")  /* => 4 */\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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 { SearchIndex, SearchResult } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search message type\n */\nexport const enum SearchMessageType {\n  SETUP,                               /* Search index setup */\n  READY,                               /* Search index ready */\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: SearchIndex                    /* Message data */\n}\n\n/**\n * A message indicating the search index is ready\n */\nexport interface SearchReadyMessage {\n  type: SearchMessageType.READY       /* Message type */\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  | SearchReadyMessage\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 ready messages\n *\n * @param message - Search worker message\n *\n * @return Test result\n */\nexport function isSearchReadyMessage(\n  message: SearchMessage\n): message is SearchReadyMessage {\n  return message.type === SearchMessageType.READY\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 <martin.donath@squidfunk.com>\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 { identity } from \"ramda\"\nimport { Observable, Subject, asyncScheduler } from \"rxjs\"\nimport {\n  map,\n  observeOn,\n  shareReplay,\n  withLatestFrom\n} from \"rxjs/operators\"\n\nimport { WorkerHandler, watchWorker } from \"browser\"\nimport { translate } from \"utilities\"\n\nimport { SearchIndex, SearchIndexPipeline } from \"../../_\"\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  index$: Observable<SearchIndex>      /* Search index observable */\n  base$: Observable<string>            /* Location base observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up search index\n *\n * @param data - Search index\n *\n * @return Search index\n */\nfunction setupSearchIndex(\n  { config, docs, index }: SearchIndex\n): SearchIndex {\n\n  /* Override default language with value from translation */\n  if (config.lang.length === 1 && config.lang[0] === \"en\")\n    config.lang = [translate(\"search.config.lang\")]\n\n  /* Override default separator with value from translation */\n  if (config.separator === \"[\\\\s\\\\-]+\")\n    config.separator = translate(\"search.config.separator\")\n\n  /* Set pipeline from translation */\n  const pipeline = translate(\"search.config.pipeline\")\n    .split(/\\s*,\\s*/)\n    .filter(identity) as SearchIndexPipeline\n\n  /* Return search index after defaulting */\n  return { config, docs, index, pipeline }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up search web worker\n *\n * This function will create a web worker to set up and query the search index\n * which is done using `lunr`. The index must be passed as an observable to\n * enable hacks like _localsearch_ via search index embedding as JSON.\n *\n * @param url - Worker URL\n * @param options - Options\n *\n * @return Worker handler\n */\nexport function setupSearchWorker(\n  url: string, { index$, base$ }: SetupOptions\n): WorkerHandler<SearchMessage> {\n  const worker = new Worker(url)\n\n  /* Create communication channels and resolve relative links */\n  const tx$ = new Subject<SearchMessage>()\n  const rx$ = watchWorker(worker, { tx$ })\n    .pipe(\n      withLatestFrom(base$),\n      map(([message, base]) => {\n        if (isSearchResultMessage(message)) {\n          for (const { article, sections } of message.data) {\n            article.location = `${base}/${article.location}`\n            for (const section of sections)\n              section.location = `${base}/${section.location}`\n          }\n        }\n        return message\n      }),\n      shareReplay(1)\n    )\n\n  /* Set up search index */\n  index$\n    .pipe(\n      map<SearchIndex, SearchSetupMessage>(index => ({\n        type: SearchMessageType.SETUP,\n        data: setupSearchIndex(index)\n      })),\n      observeOn(asyncScheduler)\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 <martin.donath@squidfunk.com>\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 <martin.donath@squidfunk.com>\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  resetSidebarOffset,\n  setSidebarHeight,\n  setSidebarOffset\n} from \"../set\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n  main$: Observable<Main>              /* Main area observable */\n  viewport$: Observable<Viewport>      /* Viewport observable */\n}\n\n/**\n * Apply options\n */\ninterface ApplyOptions {\n  header$: Observable<Header>          /* 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<Sidebar> {\n  const adjust = el.parentElement!.offsetTop\n               - el.parentElement!.parentElement!.offsetTop\n\n  /* Compute the sidebar's available height and if it should be locked */\n  return combineLatest([main$, viewport$])\n    .pipe(\n      map(([{ offset, height }, { offset: { y } }]) => {\n        height = height\n          + Math.min(adjust, Math.max(0, y - offset))\n          - adjust\n        return {\n          height,\n          lock: y >= offset + adjust\n        }\n      }),\n      distinctUntilChanged<Sidebar>((a, b) => {\n        return a.height === b.height\n            && a.lock   === b.lock\n      })\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<Sidebar> {\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\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    })\n  )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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 <martin.donath@squidfunk.com>\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>          /* Header observable */\n  main$: Observable<Main>              /* Main area observable */\n  viewport$: Observable<Viewport>      /* Viewport observable */\n  tablet$: Observable<boolean>         /* 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<HTMLElement, TableOfContents> {\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<HTMLAnchorElement>(\".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 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 <martin.donath@squidfunk.com>\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, watchElementSize } 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>          /* Header observable */\n  viewport$: Observable<Viewport>      /* 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<AnchorList> {\n  const table = new Map<HTMLAnchorElement, HTMLElement>()\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$ = watchElementSize(document.body)\n    .pipe(\n      distinctUntilKeyChanged(\"height\"),\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<HTMLAnchorElement[], number>())\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<AnchorList> {\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 <martin.donath@squidfunk.com>\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  filter,\n  map,\n  mapTo,\n  sample,\n  startWith,\n  switchMap,\n  take\n} from \"rxjs/operators\"\n\nimport { WorkerHandler } from \"browser\"\nimport {\n  SearchMessage,\n  SearchResult,\n  isSearchQueryMessage,\n  isSearchReadyMessage\n} from \"integrations/search\"\n\nimport { SearchQuery } from \"../query\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search status\n */\nexport type SearchStatus =\n  | \"waiting\"                          /* Search waiting for initialization */\n  | \"ready\"                            /* Search ready */\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search\n */\nexport interface Search {\n  status: SearchStatus                 /* Search status */\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<SearchQuery>      /* Search query observable */\n  reset$: Observable<void>             /* Search reset observable */\n  result$: Observable<SearchResult[]>  /* Search result observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search from source observable\n *\n * @param handler - Worker handler\n * @param options - Options\n *\n * @return Operator function\n */\nexport function mountSearch(\n  { rx$, tx$ }: WorkerHandler<SearchMessage>,\n  { query$, reset$, result$ }: MountOptions\n): OperatorFunction<HTMLElement, Search> {\n  return pipe(\n    switchMap(() => {\n\n      /* Compute search status */\n      const status$ = rx$\n        .pipe(\n          filter(isSearchReadyMessage),\n          mapTo<SearchStatus>(\"ready\"),\n          startWith(\"waiting\")\n        ) as Observable<SearchStatus>\n\n      /* Re-emit the latest query when search is ready */\n      tx$\n        .pipe(\n          filter(isSearchQueryMessage),\n          sample(status$),\n          take(1)\n        )\n          .subscribe(tx$.next.bind(tx$))\n\n      /* Combine into single observable */\n      return combineLatest([status$, query$, result$, reset$])\n        .pipe(\n          map(([status, query, result]) => ({\n            status,\n            query,\n            result\n          }))\n        )\n    })\n  )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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  SearchTransformFn\n} from \"integrations\"\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?: SearchTransformFn        /* 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<SearchMessage>, options: MountOptions = {}\n): OperatorFunction<HTMLInputElement, SearchQuery> {\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 <martin.donath@squidfunk.com>\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\"\nimport { SearchTransformFn, defaultTransform } from \"integrations\"\n\nimport { SearchQuery } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n  transform?: SearchTransformFn        /* Transformation function */\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<SearchQuery> {\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 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 <martin.donath@squidfunk.com>\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<HTMLElement, void> {\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 <martin.donath@squidfunk.com>\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<void> {\n  return fromEvent(el, \"click\")\n    .pipe(\n      mapTo(undefined)\n    )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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: Element\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 <martin.donath@squidfunk.com>\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<SearchQuery>     /* Search query observable */\n  ready$: Observable<boolean>         /* Search ready observable */\n  fetch$: Observable<boolean>         /* 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$, ready$, fetch$ }: ApplyOptions\n): MonoTypeOperatorFunction<SearchResult[]> {\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$, ready$),\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 <martin.donath@squidfunk.com>\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  mapTo,\n  pluck,\n  startWith,\n  switchMap\n} from \"rxjs/operators\"\n\nimport { WorkerHandler, watchElementOffset } from \"browser\"\nimport {\n  SearchMessage,\n  SearchResult,\n  isSearchReadyMessage,\n  isSearchResultMessage\n} from \"integrations\"\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<SearchQuery>      /* 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<SearchMessage>, { query$ }: MountOptions\n): OperatorFunction<HTMLElement, SearchResult[]> {\n  return pipe(\n    switchMap(el => {\n      const container = el.parentElement!\n\n      /* Compute if search is ready */\n      const ready$ = rx$\n        .pipe(\n          filter(isSearchReadyMessage),\n          mapTo(true)\n        )\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$, ready$, fetch$ }),\n          startWith([])\n        )\n    })\n  )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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>          /* Header observable */\n  viewport$: Observable<Viewport>      /* 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<HTMLElement, Main> {\n  const main$ = new Subject<Main>()\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 <martin.donath@squidfunk.com>\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>          /* Header observable */\n  viewport$: Observable<Viewport>      /* 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<Main> {\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 borders */\n  const border$ = 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(\"bottom\"),\n      shareReplay(1)\n    )\n\n  /* Compute the main area's offset, visible height and if we scrolled past */\n  return combineLatest([adjust$, border$, viewport$])\n    .pipe(\n      map(([header, { top, bottom }, { offset: { y }, size: { height } }]) => {\n        height = Math.max(0, height\n          - Math.max(0, top    - y,  header)\n          - Math.max(0, height + y - bottom)\n        )\n        return {\n          offset: top - header,\n          height,\n          active: top - header <= y\n        }\n      }),\n      distinctUntilChanged<Main>((a, b) => {\n        return a.offset === b.offset\n            && a.height === b.height\n            && a.active === b.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<Main> {\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 <martin.donath@squidfunk.com>\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 <martin.donath@squidfunk.com>\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 {\n  distinctUntilKeyChanged,\n  map,\n  switchMap\n} 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>          /* Header observable */\n  viewport$: Observable<Viewport>      /* 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<HTMLElement, Hero> {\n  return pipe(\n    switchMap(el => watchViewportAt(el, { header$, viewport$ })\n      .pipe(\n        map(({ offset: { y } }) => ({ hidden: y >= 20 })),\n        distinctUntilKeyChanged(\"hidden\"),\n        applyHero(el)\n      )\n    )\n  )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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<Hero> {\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 <martin.donath@squidfunk.com>\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 <martin.donath@squidfunk.com>\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  document$: Observable<Document>      /* Document observable */\n  viewport$: Observable<Viewport>      /* 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  { document$, viewport$ }: MountOptions\n): OperatorFunction<HTMLElement, Header> {\n  return pipe(\n    switchMap(el => {\n      const header$ = watchHeader(el, { document$ })\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<HeaderType>(\"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 <martin.donath@squidfunk.com>\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  distinctUntilChanged,\n  finalize,\n  map,\n  observeOn,\n  shareReplay,\n  switchMap,\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 * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n  document$: Observable<Document>      /* Document observable */\n}\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, { document$ }: WatchOptions\n): Observable<Omit<Header, \"type\">> {\n  return document$\n    .pipe(\n      map(() => {\n        const styles = getComputedStyle(el)\n        return [\n          \"sticky\",                    /* Modern browsers */\n          \"-webkit-sticky\"             /* Safari */\n        ].includes(styles.position)\n      }),\n      distinctUntilChanged(),\n      switchMap(sticky => {\n        if (sticky) {\n          return watchElementSize(el)\n            .pipe(\n              map(({ height }) => ({\n                sticky: true,\n                height\n              }))\n            )\n        } else {\n          return of({\n            sticky: false,\n            height: 0\n          })\n        }\n      }),\n      shareReplay(1)\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<HeaderType> {\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 <martin.donath@squidfunk.com>\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 <martin.donath@squidfunk.com>\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 {\n  distinctUntilKeyChanged,\n  map,\n  switchMap\n} 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>          /* Header observable */\n  viewport$: Observable<Viewport>      /* Viewport observable */\n  screen$: Observable<boolean>         /* 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<HTMLElement, Tabs> {\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                distinctUntilKeyChanged(\"hidden\"),\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 <martin.donath@squidfunk.com>\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<Tabs> {\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 <martin.donath@squidfunk.com>\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 <martin.donath@squidfunk.com>\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 { map, switchMap } from \"rxjs/operators\"\n\nimport { Viewport } from \"browser\"\n\nimport { Header } from \"../../header\"\nimport { Main } from \"../../main\"\nimport {\n  Sidebar,\n  applySidebar,\n  watchSidebar\n} from \"../../shared\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Navigation for [screen -]\n */\ninterface NavigationBelowScreen {} // tslint:disable-line\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>          /* Header observable */\n  main$: Observable<Main>              /* Main area observable */\n  viewport$: Observable<Viewport>      /* Viewport observable */\n  screen$: Observable<boolean>         /* 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<HTMLElement, Navigation> {\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            return of({})\n          }\n        })\n      )\n    )\n  )\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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>      /* 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\", { passive: true })\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 <martin.donath@squidfunk.com>\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>      /* 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<SourceFacts> {\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, slug] = url.match(/^.+?([^\\/]*gitlab[^\\/]+)\\/(.+?)\\/?$/i)\n      return fetchSourceFactsFromGitLab(base, slug)\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<HTMLAnchorElement>(\".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 <martin.donath@squidfunk.com>\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<SourceFacts> {\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 <martin.donath@squidfunk.com>\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<SourceFacts> {\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 <martin.donath@squidfunk.com>\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// DISCLAIMER: this file is still WIP. There're some refactoring opportunities\n// which must be tackled after we gathered some feedback on v5.\n// tslint:disable\n\nimport { sortBy, prop, values } from \"ramda\"\nimport {\n  merge,\n  combineLatest,\n  animationFrameScheduler,\n  fromEvent,\n  from,\n  defer,\n  of,\n  NEVER\n} from \"rxjs\"\nimport { ajax } from \"rxjs/ajax\"\nimport {\n  delay,\n  switchMap,\n  tap,\n  filter,\n  withLatestFrom,\n  observeOn,\n  take,\n  shareReplay,\n  pluck,\n  catchError,\n  map\n} from \"rxjs/operators\"\n\nimport {\n  watchToggle,\n  setToggle,\n  getElements,\n  watchMedia,\n  watchDocument,\n  watchLocation,\n  watchLocationHash,\n  watchViewport,\n  isLocalLocation,\n  setLocationHash,\n  watchLocationBase\n} from \"browser\"\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 {\n  setupClipboard,\n  setupDialog,\n  setupKeyboard,\n  setupInstantLoading,\n  setupSearchWorker,\n  SearchIndex\n} from \"integrations\"\nimport {\n  patchCodeBlocks,\n  patchTables,\n  patchDetails,\n  patchScrollfix,\n  patchSource,\n  patchScripts\n} from \"patches\"\nimport { isConfig } from \"utilities\"\n\n/* ------------------------------------------------------------------------- */\n\n/* Denote that JavaScript is available */\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  /* Set up subjects */\n  const document$ = watchDocument()\n  const location$ = watchLocation()\n\n  /* Set up user interface observables */\n  const base$     = watchLocationBase(config.base, { location$ })\n  const hash$     = watchLocationHash()\n  const viewport$ = watchViewport()\n  const tablet$   = watchMedia(\"(min-width: 960px)\")\n  const screen$   = watchMedia(\"(min-width: 1220px)\")\n\n  /* ----------------------------------------------------------------------- */\n\n  /* Set up component bindings */\n  setupComponents([\n    \"announce\",                        /* Announcement bar */\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  const keyboard$ = setupKeyboard()\n\n  patchCodeBlocks({ document$, viewport$ })\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  /* Set up clipboard and dialog */\n  const dialog$ = setupDialog()\n  const clipboard$ = setupClipboard({ document$, dialog$ })\n\n  /* ----------------------------------------------------------------------- */\n\n  /* Create header observable */\n  const header$ = useComponent(\"header\")\n    .pipe(\n      mountHeader({ document$, 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  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  /* Search worker */\n  const worker$ = defer(() => {\n    const index = config.search && config.search.index\n      ? config.search.index\n      : undefined\n\n    /* Fetch index if it wasn't passed explicitly */\n    const index$ = typeof index !== \"undefined\"\n      ? from(index)\n      : base$\n          .pipe(\n            switchMap(base => ajax({\n              url: `${base}/search/search_index.json`,\n              responseType: \"json\",\n              withCredentials: true\n            })\n              .pipe<SearchIndex>(\n                pluck(\"response\")\n              )\n            )\n          )\n\n    return of(setupSearchWorker(config.search.worker, {\n      base$, index$\n    }))\n  })\n\n  /* ----------------------------------------------------------------------- */\n\n  /* Mount search query */\n  const search$ = worker$\n    .pipe(\n      switchMap(worker => {\n\n        const query$ = useComponent(\"search-query\")\n          .pipe(\n            mountSearchQuery(worker, { transform: config.search.transform }),\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        return useComponent(\"search\")\n          .pipe(\n            mountSearch(worker, { query$, reset$, result$ }),\n          )\n      }),\n      catchError(() => {\n        useComponent(\"search\")\n          .subscribe(el => el.hidden = true) // TODO: Hack\n        return NEVER\n      }),\n      shareReplay(1)\n    )\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}`))\n\n  // TODO: scroll restoration must be centralized\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),\n            observeOn(animationFrameScheduler),\n            tap(({ body }) => active\n              ? setScrollLock(body, y)\n              : resetScrollLock(body)\n            )\n          )\n      })\n    )\n      .subscribe()\n\n  /* ----------------------------------------------------------------------- */\n\n  /* Always close drawer on click */\n  fromEvent<MouseEvent>(document.body, \"click\")\n    .pipe(\n      filter(ev => !(ev.metaKey || ev.ctrlKey)),\n      filter(ev => {\n        if (ev.target instanceof HTMLElement) {\n          const el = ev.target.closest(\"a\") // TODO: abstract as link click?\n          if (el && isLocalLocation(el)) {\n            return true\n          }\n        }\n        return false\n      })\n    )\n      .subscribe(() => {\n        setToggle(\"drawer\", false)\n      })\n\n  /* Enable instant loading, if not on file:// protocol */\n  if (config.features.includes(\"instant\") && location.protocol !== \"file:\") {\n\n    /* Fetch sitemap and extract URL whitelist */\n    base$\n      .pipe(\n        switchMap(base => ajax({\n          url: `${base}/sitemap.xml`,\n          responseType: \"document\",\n          withCredentials: true\n        })\n          .pipe<Document>(\n            pluck(\"response\")\n          )\n        ),\n        withLatestFrom(base$),\n        map(([document, base]) => {\n          const urls = getElements(\"loc\", document)\n            .map(node => node.textContent!)\n\n          // Hack: This is a temporary fix to normalize instant loading lookup\n          // on localhost and Netlify previews. If this approach proves to be\n          // suitable, we'll refactor URL whitelisting anyway. We take the two\n          // shortest URLs and determine the common prefix to isolate the\n          // domain. If there're no two domains, we just leave it as-is, as\n          // there isn't anything to be loaded anway.\n          if (urls.length > 1) {\n            const [a, b] = sortBy(prop(\"length\"), urls)\n\n            /* Determine common prefix */\n            let index = 0\n            if (a === b)\n              index = a.length\n            else\n              while (a.charAt(index) === b.charAt(index))\n                index++\n\n            /* Replace common prefix (i.e. base) with effective base */\n            for (let i = 0; i < urls.length; i++)\n              urls[i] = urls[i].replace(a.slice(0, index), `${base}/`)\n          }\n          return urls\n        })\n      )\n        .subscribe(urls => {\n          setupInstantLoading(urls, { document$, location$, viewport$ })\n        })\n  }\n\n  /* ----------------------------------------------------------------------- */\n\n  /* Unhide permalinks on first tab */\n  keyboard$\n    .pipe(\n      filter(key => key.mode === \"global\" && key.type === \"Tab\"),\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    location$,\n    viewport$,\n\n    /* Component observables */\n    header$,\n    hero$,\n    main$,\n    navigation$,\n    search$,\n    tabs$,\n    toc$,\n\n    /* Integration 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 <martin.donath@squidfunk.com>\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 { distinctUntilKeyChanged, map } from \"rxjs/operators\"\n\nimport { Viewport, getElements } from \"browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n  document$: Observable<Document>      /* Document observable */\n  viewport$: Observable<Viewport>      /* Viewport observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch all `code` elements\n *\n * This function will make overflowing code blocks focusable via keyboard, so\n * they can be scrolled without a mouse.\n *\n * @param options - Options\n */\nexport function patchCodeBlocks(\n  { document$, viewport$ }: MountOptions\n): void {\n  const els$ = document$\n    .pipe(\n      map(() => getElements<HTMLTableElement>(\"pre > code\"))\n    )\n\n  /* Observe viewport size only */\n  const size$ = viewport$\n    .pipe(\n      distinctUntilKeyChanged(\"size\")\n    )\n\n  /* Make overflowing elements focusable */\n  combineLatest([els$, size$])\n    .subscribe(([els]) => {\n      for (const el of els) {\n        if (el.scrollWidth > el.clientWidth)\n          el.setAttribute(\"tabindex\", \"0\")\n        else\n          el.removeAttribute(\"tabindex\")\n      }\n    })\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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>      /* Document observable */\n  hash$: Observable<string>            /* 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<HTMLDetailsElement>(\"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 <martin.donath@squidfunk.com>\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 {\n  createElement,\n  getElements,\n  replaceElement\n} from \"browser\"\nimport { useComponent } from \"components\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch options\n */\ninterface PatchOptions {\n  document$: Observable<Document>      /* 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<HTMLScriptElement>(\"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 = createElement(\"script\")\n        const key = el.src ? \"src\" : \"textContent\"\n        script[key] = el[key]!\n        replaceElement(el, script)\n      }\n    }\n  })\n}\n","/*\n * Copyright (c) 2016-2020 Martin Donath <martin.donath@squidfunk.com>\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 {\n  createElement,\n  getElements,\n  replaceElement\n} from \"browser\"\nimport { renderTable } from \"templates\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n  document$: Observable<Document>      /* 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 = createElement(\"table\")\n  document$\n    .pipe(\n      map(() => getElements<HTMLTableElement>(\"table:not([class])\"))\n    )\n      .subscribe(els => {\n        for (const el of els) {\n          replaceElement(el, sentinel)\n          replaceElement(sentinel, renderTable(el))\n        }\n      })\n}\n"],"sourceRoot":""}