diff --git a/jekyll-assets/_includes/head.html b/jekyll-assets/_includes/head.html
index 4f4896390..ee6a47ed8 100644
--- a/jekyll-assets/_includes/head.html
+++ b/jekyll-assets/_includes/head.html
@@ -21,8 +21,6 @@
-
-
+
+
{% include search.html %}
diff --git a/jekyll-assets/css/style.css b/jekyll-assets/css/style.css
index ee355de6e..d986b628e 100644
--- a/jekyll-assets/css/style.css
+++ b/jekyll-assets/css/style.css
@@ -368,11 +368,6 @@ input:checked + li span label div .toc-item::before {
margin-bottom: 6px;
}
-/* hide the non-tocbot non-interactive toctree from view -- just needed to generate tocbot version */
-#on-this-page-inner #toc {
- display: none;
-}
-
.sectlevel1 {
flex-grow: 0;
margin-right: 10px;
@@ -547,11 +542,11 @@ nav#mobile-contents {
}
@media screen{
- #tocbot > ul.toc-list{
+ #tocbot > ol.toc-list{
margin-bottom: 0.5em;
margin-left: 0.125em
}
- #tocbot ul.sectlevel0, #tocbot a.toc-link.node-name--H1 + ul {
+ #tocbot ul.sectlevel0, #tocbot a.toc-link.node-name--H1 + ol {
padding-left: 0;
}
#tocbot a.toc-link{
diff --git a/jekyll-assets/scripts/toc.js b/jekyll-assets/scripts/toc.js
deleted file mode 100644
index 562cd53e2..000000000
--- a/jekyll-assets/scripts/toc.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Trigger Tocbot dynamic TOC, works with tocbot 3.0.2 */
-function makeToc() {
- var tocElement = document.getElementById('toc');
- if (tocElement) { /* only run on pages that have a toc -- exclude boxes landing pages, for instance */
- var oldtoc = tocElement.nextElementSibling;
- var newtoc = document.getElementById('tocbot');
- newtoc.setAttribute('id', 'tocbot');
- newtoc.setAttribute('class', 'js-toc');
- oldtoc.parentNode.replaceChild(newtoc, oldtoc);
- tocbot.init({ contentSelector: '#content',
- headingSelector: 'h1, h2, h3, h4',
- smoothScroll: true,
- includeHtml: true
- });
- var handleTocOnResize = function() {
- var width = window.innerWidth
- || document.documentElement.clientWidth
- || document.body.clientWidth;
- if (width < 768) {
- tocbot.refresh({ contentSelector: '#content',
- headingSelector: 'h1, h2, h3, h4',
- collapseDepth: 6,
- activeLinkClass: 'ignoreactive',
- throttleTimeout: 1000,
- smoothScroll: true });
- }
- else {
- tocbot.refresh({ contentSelector: '#content',
- headingSelector: 'h1, h2, h3, h4',
- smoothScroll: true });
- }
- };
- window.addEventListener('resize', handleTocOnResize);
- handleTocOnResize();
- }
-}
diff --git a/jekyll-assets/scripts/tocbot.js b/jekyll-assets/scripts/tocbot.js
deleted file mode 100644
index d6c9e2892..000000000
--- a/jekyll-assets/scripts/tocbot.js
+++ /dev/null
@@ -1,1205 +0,0 @@
-/******/ (() => { // webpackBootstrap
-/******/ "use strict";
-/******/ var __webpack_modules__ = ({
-
-/***/ "./src/js/build-html.js":
-/*!******************************!*\
- !*** ./src/js/build-html.js ***!
- \******************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ "default": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__)
-/* harmony export */ });
-/**
- * This file is responsible for building the DOM and updating DOM state.
- *
- * @author Tim Scanlin
- */
-
-/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(options) {
- const forEach = [].forEach
- const some = [].some
- const body = typeof window !== 'undefined' && document.body
- const SPACE_CHAR = ' '
- let tocElement
- let currentlyHighlighting = true
-
- /**
- * Create link and list elements.
- * @param {Object} d
- * @param {HTMLElement} container
- * @return {HTMLElement}
- */
- function createEl (d, container) {
- const link = container.appendChild(createLink(d))
- if (d.children.length) {
- const list = createList(d.isCollapsed)
- d.children.forEach((child) => {
- createEl(child, list)
- })
- link.appendChild(list)
- }
- }
-
- /**
- * Render nested heading array data into a given element.
- * @param {HTMLElement} parent Optional. If provided updates the {@see tocElement} to match.
- * @param {Array} data
- * @return {HTMLElement}
- */
- function render (parent, data) {
- const collapsed = false
- const container = createList(collapsed)
-
- data.forEach((d) => {
- createEl(d, container)
- })
-
- // Return if no TOC element is provided or known.
- tocElement = parent || tocElement
- if (tocElement === null) {
- return
- }
-
- // Remove existing child if it exists.
- if (tocElement.firstChild) {
- tocElement.removeChild(tocElement.firstChild)
- }
-
- // Just return the parent and don't append the list if no links are found.
- if (data.length === 0) {
- return tocElement
- }
-
- // Append the Elements that have been created
- return tocElement.appendChild(container)
- }
-
- /**
- * Create link element.
- * @param {Object} data
- * @return {HTMLElement}
- */
- function createLink (data) {
- const item = document.createElement('li')
- const a = document.createElement('a')
- if (options.listItemClass) {
- item.setAttribute('class', options.listItemClass)
- }
-
- if (options.onClick) {
- a.onclick = options.onClick
- }
-
- if (options.includeTitleTags) {
- a.setAttribute('title', data.textContent)
- }
-
- if (options.includeHtml && data.childNodes.length) {
- forEach.call(data.childNodes, (node) => {
- a.appendChild(node.cloneNode(true))
- })
- } else {
- // Default behavior. Set to textContent to keep tests happy.
- a.textContent = data.textContent
- }
- a.setAttribute('href', `${options.basePath}#${data.id}`)
- a.setAttribute('class', `${options.linkClass +
- SPACE_CHAR}node-name--${data.nodeName}${SPACE_CHAR}${options.extraLinkClasses}`)
- item.appendChild(a)
- return item
- }
-
- /**
- * Create list element.
- * @param {Boolean} isCollapsed
- * @return {HTMLElement}
- */
- function createList (isCollapsed) {
- const listElement = (options.orderedList) ? 'ol' : 'ul'
- const list = document.createElement(listElement)
- let classes = options.listClass + SPACE_CHAR + options.extraListClasses
- if (isCollapsed) {
- // No plus/equals here fixes compilation issue.
- classes = classes + SPACE_CHAR + options.collapsibleClass
- classes = classes + SPACE_CHAR + options.isCollapsedClass
- }
- list.setAttribute('class', classes)
- return list
- }
-
- /**
- * Update fixed sidebar class.
- * @return {HTMLElement}
- */
- function updateFixedSidebarClass () {
- const scrollTop = getScrollTop()
-
- const posFixedEl = document.querySelector(options.positionFixedSelector)
- if (options.fixedSidebarOffset === 'auto') {
- options.fixedSidebarOffset = tocElement.offsetTop
- }
-
- if (scrollTop > options.fixedSidebarOffset) {
- if (posFixedEl.className.indexOf(options.positionFixedClass) === -1) {
- posFixedEl.className += SPACE_CHAR + options.positionFixedClass
- }
- } else {
- posFixedEl.className = posFixedEl.className.replace(SPACE_CHAR + options.positionFixedClass, '')
- }
- }
-
- /**
- * Get top position of heading
- * @param {HTMLElement} obj
- * @return {int} position
- */
- function getHeadingTopPos (obj) {
- let position = 0
- if (obj !== null) {
- position = obj.offsetTop
- if (options.hasInnerContainers) { position += getHeadingTopPos(obj.offsetParent) }
- }
- return position
- }
-
- /**
- * Update className only when changed.
- * @param {HTMLElement} obj
- * @param {string} className
- * @return {HTMLElement} obj
- */
- function updateClassname (obj, className) {
- if (obj && obj.className !== className) {
- obj.className = className
- }
- return obj
- }
-
- /**
- * Update TOC highlighting and collapsed groupings.
- */
- function updateToc (headingsArray) {
- // Add fixed class at offset
- if (options.positionFixedSelector) {
- updateFixedSidebarClass()
- }
-
- // Get the top most heading currently visible on the page so we know what to highlight.
- const headings = headingsArray
- // Using some instead of each so that we can escape early.
- if (currentlyHighlighting &&
- !!tocElement &&
- headings.length > 0) {
- const topHeader = getTopHeader(headings)
-
- const oldActiveTocLink = tocElement.querySelector(`.${options.activeLinkClass}`)
- const activeTocLink = tocElement
- .querySelector(`.${options.linkClass}.node-name--${topHeader.nodeName}[href="${options.basePath}#${topHeader.id.replace(/([ #;&,.+*~':"!^$[\]()=>|/\\@])/g, '\\$1')}"]`)
- // Performance improvement to only change the classes
- // for the toc if a new link should be highlighted.
- if (oldActiveTocLink === activeTocLink) {
- return
- }
-
- // Remove the active class from the other tocLinks.
- const tocLinks = tocElement
- .querySelectorAll(`.${options.linkClass}`)
- forEach.call(tocLinks, (tocLink) => {
- updateClassname(tocLink, tocLink.className.replace(SPACE_CHAR + options.activeLinkClass, ''))
- })
- const tocLis = tocElement
- .querySelectorAll(`.${options.listItemClass}`)
- forEach.call(tocLis, (tocLi) => {
- updateClassname(tocLi, tocLi.className.replace(SPACE_CHAR + options.activeListItemClass, ''))
- })
-
- // Add the active class to the active tocLink.
- if (activeTocLink && activeTocLink.className.indexOf(options.activeLinkClass) === -1) {
- activeTocLink.className += SPACE_CHAR + options.activeLinkClass
- }
- const li = activeTocLink?.parentNode
- if (li && li.className.indexOf(options.activeListItemClass) === -1) {
- li.className += SPACE_CHAR + options.activeListItemClass
- }
-
- const tocLists = tocElement
- .querySelectorAll(`.${options.listClass}.${options.collapsibleClass}`)
-
- // Collapse the other collapsible lists.
- forEach.call(tocLists, (list) => {
- if (list.className.indexOf(options.isCollapsedClass) === -1) {
- list.className += SPACE_CHAR + options.isCollapsedClass
- }
- })
-
- // Expand the active link's collapsible list and its sibling if applicable.
- if (activeTocLink?.nextSibling && activeTocLink.nextSibling.className.indexOf(options.isCollapsedClass) !== -1) {
- updateClassname(activeTocLink.nextSibling, activeTocLink.nextSibling.className.replace(SPACE_CHAR + options.isCollapsedClass, ''))
- }
- removeCollapsedFromParents(activeTocLink?.parentNode.parentNode)
- }
- }
-
- /**
- * Remove collapsed class from parent elements.
- * @param {HTMLElement} element
- * @return {HTMLElement}
- */
- function removeCollapsedFromParents (element) {
- if (element && element.className.indexOf(options.collapsibleClass) !== -1 && element.className.indexOf(options.isCollapsedClass) !== -1) {
- updateClassname(element, element.className.replace(SPACE_CHAR + options.isCollapsedClass, ''))
- return removeCollapsedFromParents(element.parentNode.parentNode)
- }
- return element
- }
-
- /**
- * Disable TOC Animation when a link is clicked.
- * @param {Event} event
- */
- function disableTocAnimation (event) {
- const target = event.target || event.srcElement
- if (typeof target.className !== 'string' || target.className.indexOf(options.linkClass) === -1) {
- return
- }
- // Bind to tocLink clicks to temporarily disable highlighting
- // while smoothScroll is animating.
- currentlyHighlighting = false
- }
-
- /**
- * Enable TOC Animation.
- */
- function enableTocAnimation () {
- currentlyHighlighting = true
- }
-
- /**
- * Return currently highlighting status.
- */
- function getCurrentlyHighlighting () {
- return currentlyHighlighting
- }
-
- function getScrollTop () {
- // If a fixed content container was set
- let top
- if (options.scrollContainer && document.querySelector(options.scrollContainer)) {
- top = document.querySelector(options.scrollContainer).scrollTop
- } else {
- top = document.documentElement.scrollTop || body.scrollTop
- }
- return top
- }
-
- function getTopHeader (headings, scrollTop = getScrollTop()) {
- let topHeader
- some.call(headings, (heading, i) => {
- if (getHeadingTopPos(heading) > scrollTop + options.headingsOffset + 10) {
- // Don't allow negative index value.
- const index = (i === 0) ? i : i - 1
- topHeader = headings[index]
- return true
- }
- if (i === headings.length - 1) {
- // This allows scrolling for the last heading on the page.
- topHeader = headings[headings.length - 1]
- return true
- }
- })
- return topHeader
- }
-
- function updateUrlHashForHeader (headingsArray) {
- const scrollTop = getScrollTop()
- const topHeader = getTopHeader(headingsArray, scrollTop)
- if (!topHeader || scrollTop < 5) {
- if (!(window.location.hash === '#' || window.location.hash === '')) {
- window.history.pushState(null, null, '#')
- }
- } else if (topHeader) {
- const newHash = `#${topHeader.id}`
- if (window.location.hash !== newHash) {
- window.history.pushState(null, null, newHash)
- }
- }
- }
-
- return {
- enableTocAnimation,
- disableTocAnimation,
- render,
- updateToc,
- getCurrentlyHighlighting,
- getTopHeader,
- getScrollTop,
- updateUrlHashForHeader
- }
-}
-
-
-/***/ }),
-
-/***/ "./src/js/default-options.js":
-/*!***********************************!*\
- !*** ./src/js/default-options.js ***!
- \***********************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
-/* harmony export */ });
-/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
- // Where to render the table of contents.
- tocSelector: '.js-toc',
- // Or, you can pass in a DOM node instead
- tocElement: null,
- // Where to grab the headings to build the table of contents.
- contentSelector: '.js-toc-content',
- // Or, you can pass in a DOM node instead
- contentElement: null,
- // Which headings to grab inside of the contentSelector element.
- headingSelector: 'h1, h2, h3',
- // Headings that match the ignoreSelector will be skipped.
- ignoreSelector: '.js-toc-ignore',
- // For headings inside relative or absolute positioned
- // containers within content.
- hasInnerContainers: false,
- // Main class to add to links.
- linkClass: 'toc-link',
- // Extra classes to add to links.
- extraLinkClasses: '',
- // Class to add to active links,
- // the link corresponding to the top most heading on the page.
- activeLinkClass: 'is-active-link',
- // Main class to add to lists.
- listClass: 'toc-list',
- // Extra classes to add to lists.
- extraListClasses: '',
- // Class that gets added when a list should be collapsed.
- isCollapsedClass: 'is-collapsed',
- // Class that gets added when a list should be able
- // to be collapsed but isn't necessarily collapsed.
- collapsibleClass: 'is-collapsible',
- // Class to add to list items.
- listItemClass: 'toc-list-item',
- // Class to add to active list items.
- activeListItemClass: 'is-active-li',
- // How many heading levels should not be collapsed.
- // For example, number 6 will show everything since
- // there are only 6 heading levels and number 0 will collapse them all.
- // The sections that are hidden will open
- // and close as you scroll to headings within them.
- collapseDepth: 2,
- // Smooth scrolling enabled.
- scrollSmooth: true,
- // Smooth scroll duration.
- scrollSmoothDuration: 420,
- // Smooth scroll offset.
- scrollSmoothOffset: 0,
- // Callback for scroll end.
- scrollEndCallback: function (e) {},
- // Headings offset between the headings and the top of
- // the document (this is meant for minor adjustments).
- headingsOffset: 2,
- // Timeout between events firing to make sure it's
- // not too rapid (for performance reasons).
- throttleTimeout: 50,
- // Element to add the positionFixedClass to.
- positionFixedSelector: null,
- // Fixed position class to add to make sidebar fixed after scrolling
- // down past the fixedSidebarOffset.
- positionFixedClass: 'is-position-fixed',
- // fixedSidebarOffset can be any number but by default is set
- // to auto which sets the fixedSidebarOffset to the sidebar
- // element's offsetTop from the top of the document on init.
- fixedSidebarOffset: 'auto',
- // includeHtml can be set to true to include the HTML markup from the
- // heading node instead of just including the innerText.
- includeHtml: true,
- // includeTitleTags automatically sets the html title tag of the link
- // to match the title. This can be useful for SEO purposes or
- // when truncating titles.
- includeTitleTags: false,
- // onclick function to apply to all links in toc. will be called with
- // the event as the first parameter, and this can be used to stop,
- // propagation, prevent default or perform action
- onClick: function (e) {},
- // orderedList can be set to false to generate unordered lists (ul)
- // instead of ordered lists (ol)
- orderedList: false,
- // If there is a fixed article scroll container, set to calculate offset.
- scrollContainer: null,
- // prevent ToC DOM rendering if it's already rendered by an external system.
- skipRendering: false,
- // Optional callback to change heading labels.
- // For example it can be used to cut down and put ellipses on multiline headings you deem too long.
- // Called each time a heading is parsed. Expects a string and returns the modified label to display.
- // Additionally, the attribute `data-heading-label` may be used on a heading to specify
- // a shorter string to be used in the TOC.
- // function (string) => string
- headingLabelCallback: false,
- // ignore headings that are hidden in DOM
- ignoreHiddenElements: false,
- // Optional callback to modify properties of parsed headings.
- // The heading element is passed in node parameter and information
- // parsed by default parser is provided in obj parameter.
- // Function has to return the same or modified obj.
- // The heading will be excluded from TOC if nothing is returned.
- // function (object, HTMLElement) => object | void
- headingObjectCallback: null,
- // Set the base path, useful if you use a `base` tag in `head`.
- basePath: '',
- // Only takes affect when `tocSelector` is scrolling,
- // keep the toc scroll position in sync with the content.
- disableTocScrollSync: false,
- // If this is null then just use `tocElement` or `tocSelector` instead
- // assuming `disableTocScrollSync` is set to false. This allows for
- // scrolling an outer element (like a nav panel w/ search) containing the toc.
- tocScrollingWrapper: null,
- // Offset for the toc scroll (top) position when scrolling the page.
- // Only effective if `disableTocScrollSync` is false.
- tocScrollOffset: 0,
- // Enable the URL hash to update with the proper heading ID as
- // a user scrolls the page.
- enableUrlHashUpdateOnScroll: false
-});
-
-
-/***/ }),
-
-/***/ "./src/js/index-esm.js":
-/*!*****************************!*\
- !*** ./src/js/index-esm.js ***!
- \*****************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ "_buildHtml": () => (/* binding */ _buildHtml),
-/* harmony export */ "_headingsArray": () => (/* binding */ _headingsArray),
-/* harmony export */ "_options": () => (/* binding */ _options),
-/* harmony export */ "_parseContent": () => (/* binding */ _parseContent),
-/* harmony export */ "_scrollListener": () => (/* binding */ _scrollListener),
-/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
-/* harmony export */ "destroy": () => (/* binding */ destroy),
-/* harmony export */ "init": () => (/* binding */ init),
-/* harmony export */ "refresh": () => (/* binding */ refresh)
-/* harmony export */ });
-/* harmony import */ var _build_html_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./build-html.js */ "./src/js/build-html.js");
-/* harmony import */ var _default_options_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./default-options.js */ "./src/js/default-options.js");
-/* harmony import */ var _parse_content_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./parse-content.js */ "./src/js/parse-content.js");
-/* harmony import */ var _scroll_smooth_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./scroll-smooth/index.js */ "./src/js/scroll-smooth/index.js");
-/* harmony import */ var _update_toc_scroll_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./update-toc-scroll.js */ "./src/js/update-toc-scroll.js");
-/* eslint no-var: off */
-/**
- * Tocbot
- * Tocbot creates a table of contents based on HTML headings on a page,
- * this allows users to easily jump to different sections of the document.
- * Tocbot was inspired by tocify (http://gregfranko.com/jquery.tocify.js/).
- * The main differences are that it works natively without any need for jquery or jquery UI).
- *
- * @author Tim Scanlin
- */
-
-
-
-
-
-
-
-// For testing purposes.
-let _options = {} // Object to store current options.
-let _buildHtml
-let _parseContent
-let _headingsArray
-let _scrollListener
-
-let clickListener
-
-/**
- * Initialize tocbot.
- * @param {object} customOptions
- */
-function init (customOptions) {
- // Merge defaults with user options.
- // Set to options variable at the top.
- _options = extend(_default_options_js__WEBPACK_IMPORTED_MODULE_1__["default"], customOptions || {})
-
- // Init smooth scroll if enabled (default).
- if (_options.scrollSmooth) {
- _options.duration = _options.scrollSmoothDuration
- _options.offset = _options.scrollSmoothOffset
-
- ;(0,_scroll_smooth_index_js__WEBPACK_IMPORTED_MODULE_3__["default"])(_options)
- }
-
- // Pass options to these modules.
- _buildHtml = (0,_build_html_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_options)
- _parseContent = (0,_parse_content_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_options)
-
- // Destroy it if it exists first.
- destroy()
-
- const contentElement = getContentElement(_options)
- if (contentElement === null) {
- return
- }
-
- const tocElement = getTocElement(_options)
- if (tocElement === null) {
- return
- }
-
- // Get headings array.
- _headingsArray = _parseContent.selectHeadings(
- contentElement,
- _options.headingSelector
- )
-
- // Return if no headings are found.
- if (_headingsArray === null) {
- return
- }
-
- // Build nested headings array.
- const nestedHeadingsObj = _parseContent.nestHeadingsArray(_headingsArray)
- const nestedHeadings = nestedHeadingsObj.nest
-
- // Render.
- if (!_options.skipRendering) {
- _buildHtml.render(tocElement, nestedHeadings)
- } else {
- // No need to attach listeners if skipRendering is true, this was causing errors.
- return this
- }
-
- // Update Sidebar and bind listeners.
- _scrollListener = throttle((e) => {
- _buildHtml.updateToc(_headingsArray)
- !_options.disableTocScrollSync && (0,_update_toc_scroll_js__WEBPACK_IMPORTED_MODULE_4__["default"])(_options)
-
- if (_options.enableUrlHashUpdateOnScroll) {
- const enableUpdatingHash = _buildHtml.getCurrentlyHighlighting()
- enableUpdatingHash && _buildHtml.updateUrlHashForHeader(_headingsArray)
- }
-
- const isTop =
- e?.target?.scrollingElement &&
- e.target.scrollingElement.scrollTop === 0
- if ((e && (e.eventPhase === 0 || e.currentTarget === null)) || isTop) {
- _buildHtml.updateToc(_headingsArray)
- if (_options.scrollEndCallback) {
- _options.scrollEndCallback(e)
- }
- }
- }, _options.throttleTimeout)
- _scrollListener()
- if (
- _options.scrollContainer &&
- document.querySelector(_options.scrollContainer)
- ) {
- document
- .querySelector(_options.scrollContainer)
- .addEventListener('scroll', _scrollListener, false)
- document
- .querySelector(_options.scrollContainer)
- .addEventListener('resize', _scrollListener, false)
- } else {
- document.addEventListener('scroll', _scrollListener, false)
- document.addEventListener('resize', _scrollListener, false)
- }
-
- // Bind click listeners to disable animation.
- let timeout = null
- clickListener = throttle((event) => {
- if (_options.scrollSmooth) {
- _buildHtml.disableTocAnimation(event)
- }
- _buildHtml.updateToc(_headingsArray)
- // Timeout to re-enable the animation.
- timeout && clearTimeout(timeout)
- timeout = setTimeout(() => {
- _buildHtml.enableTocAnimation()
- }, _options.scrollSmoothDuration)
- }, _options.throttleTimeout)
-
- if (
- _options.scrollContainer &&
- document.querySelector(_options.scrollContainer)
- ) {
- document
- .querySelector(_options.scrollContainer)
- .addEventListener('click', clickListener, false)
- } else {
- document.addEventListener('click', clickListener, false)
- }
-}
-
-/**
- * Destroy tocbot.
- */
-function destroy () {
- const tocElement = getTocElement(_options)
- if (tocElement === null) {
- return
- }
-
- if (!_options.skipRendering) {
- // Clear HTML.
- if (tocElement) {
- tocElement.innerHTML = ''
- }
- }
-
- // Remove event listeners.
- if (
- _options.scrollContainer &&
- document.querySelector(_options.scrollContainer)
- ) {
- document
- .querySelector(_options.scrollContainer)
- .removeEventListener('scroll', _scrollListener, false)
- document
- .querySelector(_options.scrollContainer)
- .removeEventListener('resize', _scrollListener, false)
- if (_buildHtml) {
- document
- .querySelector(_options.scrollContainer)
- .removeEventListener('click', clickListener, false)
- }
- } else {
- document.removeEventListener('scroll', _scrollListener, false)
- document.removeEventListener('resize', _scrollListener, false)
- if (_buildHtml) {
- document.removeEventListener('click', clickListener, false)
- }
- }
-}
-
-/**
- * Refresh tocbot.
- */
-function refresh (customOptions) {
- destroy()
- init(customOptions || _options)
-}
-
-// From: https://github.com/Raynos/xtend
-const hasOwnProp = Object.prototype.hasOwnProperty
-function extend (...args) {
- const target = {}
- for (let i = 0; i < args.length; i++) {
- const source = args[i]
- for (const key in source) {
- if (hasOwnProp.call(source, key)) {
- target[key] = source[key]
- }
- }
- }
- return target
-}
-
-// From: https://remysharp.com/2010/07/21/throttling-function-calls
-function throttle (fn, threshold, scope) {
- threshold || (threshold = 250)
- let last
- let deferTimer
- return function (...args) {
- const context = scope || this
- const now = +new Date()
- if (last && now < last + threshold) {
- // hold on to it
- clearTimeout(deferTimer)
- deferTimer = setTimeout(() => {
- last = now
- fn.apply(context, args)
- }, threshold)
- } else {
- last = now
- fn.apply(context, args)
- }
- }
-}
-
-function getContentElement (options) {
- try {
- return (
- options.contentElement || document.querySelector(options.contentSelector)
- )
- } catch (e) {
- console.warn(`Contents element not found: ${options.contentSelector}`) // eslint-disable-line
- return null
- }
-}
-
-function getTocElement (options) {
- try {
- return options.tocElement || document.querySelector(options.tocSelector)
- } catch (e) {
- console.warn(`TOC element not found: ${options.tocSelector}`) // eslint-disable-line
- return null
- }
-}
-
-// Add default export for easier use.
-const tocbot = {
- _options,
- _buildHtml,
- _parseContent,
- init,
- destroy,
- refresh
-}
-
-/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (tocbot);
-
-
-/***/ }),
-
-/***/ "./src/js/parse-content.js":
-/*!*********************************!*\
- !*** ./src/js/parse-content.js ***!
- \*********************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ "default": () => (/* binding */ parseContent)
-/* harmony export */ });
-/**
- * This file is responsible for parsing the content from the DOM and making
- * sure data is nested properly.
- *
- * @author Tim Scanlin
- */
-
-function parseContent (options) {
- const reduce = [].reduce
-
- /**
- * Get the last item in an array and return a reference to it.
- * @param {Array} array
- * @return {Object}
- */
- function getLastItem (array) {
- return array[array.length - 1]
- }
-
- /**
- * Get heading level for a heading dom node.
- * @param {HTMLElement} heading
- * @return {Number}
- */
- function getHeadingLevel (heading) {
- return +heading.nodeName.toUpperCase().replace('H', '')
- }
-
- /**
- * Determine whether the object is an HTML Element.
- * Also works inside iframes. HTML Elements might be created by the parent document.
- * @param {Object} maybeElement
- * @return {Number}
- */
- function isHTMLElement (maybeElement) {
- try {
- return (
- maybeElement instanceof window.HTMLElement ||
- maybeElement instanceof window.parent.HTMLElement
- )
- } catch (e) {
- return maybeElement instanceof window.HTMLElement
- }
- }
-
- /**
- * Get important properties from a heading element and store in a plain object.
- * @param {HTMLElement} heading
- * @return {Object}
- */
- function getHeadingObject (heading) {
- // each node is processed twice by this method because nestHeadingsArray() and addNode() calls it
- // first time heading is real DOM node element, second time it is obj
- // that is causing problem so I am processing only original DOM node
- if (!isHTMLElement(heading)) return heading
-
- if (options.ignoreHiddenElements && (!heading.offsetHeight || !heading.offsetParent)) {
- return null
- }
-
- const headingLabel = heading.getAttribute('data-heading-label') ||
- (options.headingLabelCallback ? String(options.headingLabelCallback(heading.innerText)) : (heading.innerText || heading.textContent).trim())
- const obj = {
- id: heading.id,
- children: [],
- nodeName: heading.nodeName,
- headingLevel: getHeadingLevel(heading),
- textContent: headingLabel
- }
-
- obj.childNodes = heading.childNodes
-
- if (options.headingObjectCallback) {
- return options.headingObjectCallback(obj, heading)
- }
-
- return obj
- }
-
- /**
- * Add a node to the nested array.
- * @param {Object} node
- * @param {Array} nest
- * @return {Array}
- */
- function addNode (node, nest) {
- const obj = getHeadingObject(node)
- const level = obj.headingLevel
- let array = nest
- let lastItem = getLastItem(array)
- const lastItemLevel = lastItem
- ? lastItem.headingLevel
- : 0
- let counter = level - lastItemLevel
-
- while (counter > 0) {
- lastItem = getLastItem(array)
- // Handle case where there are multiple h5+ in a row.
- if (lastItem && level === lastItem.headingLevel) {
- break
- } else if (lastItem && lastItem.children !== undefined) {
- array = lastItem.children
- }
- counter--
- }
-
- if (level >= options.collapseDepth) {
- obj.isCollapsed = true
- }
-
- array.push(obj)
- return array
- }
-
- /**
- * Select headings in content area, exclude any selector in options.ignoreSelector
- * @param {HTMLElement} contentElement
- * @param {Array} headingSelector
- * @return {Array}
- */
- function selectHeadings (contentElement, headingSelector) {
- let selectors = headingSelector
- if (options.ignoreSelector) {
- selectors = headingSelector.split(',')
- .map(function mapSelectors (selector) {
- return `${selector.trim()}:not(${options.ignoreSelector})`
- })
- }
- try {
- return contentElement.querySelectorAll(selectors)
- } catch (e) {
- console.warn(`Headers not found with selector: ${selectors}`); // eslint-disable-line
- return null
- }
- }
-
- /**
- * Nest headings array into nested arrays with 'children' property.
- * @param {Array} headingsArray
- * @return {Object}
- */
- function nestHeadingsArray (headingsArray) {
- return reduce.call(headingsArray, function reducer (prev, curr) {
- const currentHeading = getHeadingObject(curr)
- if (currentHeading) {
- addNode(currentHeading, prev.nest)
- }
- return prev
- }, {
- nest: []
- })
- }
-
- return {
- nestHeadingsArray,
- selectHeadings
- }
-}
-
-
-/***/ }),
-
-/***/ "./src/js/scroll-smooth/index.js":
-/*!***************************************!*\
- !*** ./src/js/scroll-smooth/index.js ***!
- \***************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ "default": () => (/* binding */ initSmoothScrolling)
-/* harmony export */ });
-/* eslint no-var: off */
-/* globals location, requestAnimationFrame */
-
-function initSmoothScrolling (options) {
- // if (isCssSmoothSCrollSupported()) { return }
-
- var duration = options.duration
- var offset = options.offset
- if (typeof window === 'undefined' || typeof location === 'undefined') return
-
- var pageUrl = location.hash
- ? stripHash(location.href)
- : location.href
-
- delegatedLinkHijacking()
-
- function delegatedLinkHijacking () {
- document.body.addEventListener('click', onClick, false)
-
- function onClick (e) {
- if (
- !isInPageLink(e.target) ||
- e.target.className.indexOf('no-smooth-scroll') > -1 ||
- (e.target.href.charAt(e.target.href.length - 2) === '#' &&
- e.target.href.charAt(e.target.href.length - 1) === '!') ||
- e.target.className.indexOf(options.linkClass) === -1) {
- return
- }
-
- // Don't prevent default or hash doesn't change.
- // e.preventDefault()
-
- jump(e.target.hash, {
- duration,
- offset,
- callback: function () {
- setFocus(e.target.hash)
- }
- })
- }
- }
-
- function isInPageLink (n) {
- return n.tagName.toLowerCase() === 'a' &&
- (n.hash.length > 0 || n.href.charAt(n.href.length - 1) === '#') &&
- (stripHash(n.href) === pageUrl || stripHash(n.href) + '#' === pageUrl)
- }
-
- function stripHash (url) {
- return url.slice(0, url.lastIndexOf('#'))
- }
-
- // function isCssSmoothSCrollSupported () {
- // return 'scrollBehavior' in document.documentElement.style
- // }
-
- // Adapted from:
- // https://www.nczonline.net/blog/2013/01/15/fixing-skip-to-content-links/
- function setFocus (hash) {
- var element = document.getElementById(hash.substring(1))
-
- if (element) {
- if (!/^(?:a|select|input|button|textarea)$/i.test(element.tagName)) {
- element.tabIndex = -1
- }
-
- element.focus()
- }
- }
-}
-
-function jump (target, options) {
- var start = window.pageYOffset
- var opt = {
- duration: options.duration,
- offset: options.offset || 0,
- callback: options.callback,
- easing: options.easing || easeInOutQuad
- }
- // This makes ids that start with a number work: ('[id="' + decodeURI(target).split('#').join('') + '"]')
- // DecodeURI for nonASCII hashes, they was encoded, but id was not encoded, it lead to not finding the tgt element by id.
- // And this is for IE: document.body.scrollTop
- // Handle decoded and non-decoded URIs since sometimes URLs automatically transform them (support for internation chars).
- var tgt = document.querySelector('[id="' + decodeURI(target).split('#').join('') + '"]') ||
- document.querySelector('[id="' + (target).split('#').join('') + '"]')
- var distance = typeof target === 'string'
- ? opt.offset + (
- target
- ? (tgt && tgt.getBoundingClientRect().top) || 0 // handle non-existent links better.
- : -(document.documentElement.scrollTop || document.body.scrollTop))
- : target
- var duration = typeof opt.duration === 'function'
- ? opt.duration(distance)
- : opt.duration
- var timeStart
- var timeElapsed
-
- requestAnimationFrame(function (time) { timeStart = time; loop(time) })
- function loop (time) {
- timeElapsed = time - timeStart
-
- window.scrollTo(0, opt.easing(timeElapsed, start, distance, duration))
-
- if (timeElapsed < duration) { requestAnimationFrame(loop) } else { end() }
- }
-
- function end () {
- window.scrollTo(0, start + distance)
-
- if (typeof opt.callback === 'function') { opt.callback() }
- }
-
- // Robert Penner's easeInOutQuad - http://robertpenner.com/easing/
- function easeInOutQuad (t, b, c, d) {
- t /= d / 2
- if (t < 1) return c / 2 * t * t + b
- t--
- return -c / 2 * (t * (t - 2) - 1) + b
- }
-}
-
-
-/***/ }),
-
-/***/ "./src/js/update-toc-scroll.js":
-/*!*************************************!*\
- !*** ./src/js/update-toc-scroll.js ***!
- \*************************************/
-/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
-
-__webpack_require__.r(__webpack_exports__);
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ "default": () => (/* binding */ updateTocScroll)
-/* harmony export */ });
-const SCROLL_LEEWAY = 30
-function updateTocScroll (options) {
- const toc = options.tocScrollingWrapper || options.tocElement || document.querySelector(options.tocSelector)
- if (toc && toc.scrollHeight > toc.clientHeight) {
- const activeItem = toc.querySelector(`.${options.activeListItemClass}`)
- if (activeItem) {
- // Determine container top and bottom
- const cTop = toc.scrollTop
- const cBottom = cTop + toc.clientHeight
-
- // Determine element top and bottom
- const eTop = activeItem.offsetTop
- const eBottom = eTop + activeItem.clientHeight
-
- // Check if out of view
- // Above scroll view
- if (eTop < cTop + options.tocScrollOffset) {
- toc.scrollTop -= (cTop - eTop) + options.tocScrollOffset
- // Below scroll view
- } else if (eBottom > cBottom - options.tocScrollOffset - SCROLL_LEEWAY) {
- toc.scrollTop += (eBottom - cBottom) + options.tocScrollOffset + (2 * SCROLL_LEEWAY)
- }
- }
- }
-}
-
-
-/***/ })
-
-/******/ });
-/************************************************************************/
-/******/ // The module cache
-/******/ var __webpack_module_cache__ = {};
-/******/
-/******/ // The require function
-/******/ function __webpack_require__(moduleId) {
-/******/ // Check if module is in cache
-/******/ var cachedModule = __webpack_module_cache__[moduleId];
-/******/ if (cachedModule !== undefined) {
-/******/ return cachedModule.exports;
-/******/ }
-/******/ // Create a new module (and put it into the cache)
-/******/ var module = __webpack_module_cache__[moduleId] = {
-/******/ // no module.id needed
-/******/ // no module.loaded needed
-/******/ exports: {}
-/******/ };
-/******/
-/******/ // Execute the module function
-/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
-/******/
-/******/ // Return the exports of the module
-/******/ return module.exports;
-/******/ }
-/******/
-/************************************************************************/
-/******/ /* webpack/runtime/define property getters */
-/******/ (() => {
-/******/ // define getter functions for harmony exports
-/******/ __webpack_require__.d = (exports, definition) => {
-/******/ for(var key in definition) {
-/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
-/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
-/******/ }
-/******/ }
-/******/ };
-/******/ })();
-/******/
-/******/ /* webpack/runtime/hasOwnProperty shorthand */
-/******/ (() => {
-/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
-/******/ })();
-/******/
-/******/ /* webpack/runtime/make namespace object */
-/******/ (() => {
-/******/ // define __esModule on exports
-/******/ __webpack_require__.r = (exports) => {
-/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/ }
-/******/ Object.defineProperty(exports, '__esModule', { value: true });
-/******/ };
-/******/ })();
-/******/
-/************************************************************************/
-var __webpack_exports__ = {};
-// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
-(() => {
-/*!******************************!*\
- !*** ./src/js/index-dist.js ***!
- \******************************/
-__webpack_require__.r(__webpack_exports__);
-/* harmony import */ var _index_esm_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index-esm.js */ "./src/js/index-esm.js");
-/* globals define */
-
-(function (root, factory) {
- if (typeof define === 'function' && define.amd) {
- define([], factory(root))
- } else if (typeof exports === 'object') {
- module.exports = factory(root)
- } else {
- root.tocbot = factory(root)
- }
-})(typeof global !== 'undefined' ? global : window || global, function (root) {
- 'use strict'
-
- // Just return if its not a browser.
- const supports =
- !!root &&
- !!root.document &&
- !!root.document.querySelector &&
- !!root.addEventListener // Feature test
- if (typeof window === 'undefined' && !supports) {
- return
- }
-
- // Make tocbot available globally.
- root.tocbot = _index_esm_js__WEBPACK_IMPORTED_MODULE_0__
-
- return _index_esm_js__WEBPACK_IMPORTED_MODULE_0__
-})
-
-})();
-
-/******/ })()
-;
\ No newline at end of file
diff --git a/jekyll-assets/scripts/tocbot.min.js b/jekyll-assets/scripts/tocbot.min.js
new file mode 100644
index 000000000..671f08f40
--- /dev/null
+++ b/jekyll-assets/scripts/tocbot.min.js
@@ -0,0 +1 @@
+(()=>{"use strict";var e={d:(t,n)=>{for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};function n(e){const t=[].forEach,n=[].some,o="undefined"!=typeof window&&document.body,l=" ";let r,s=!0,i=0;function c(n,o){const r=o.appendChild(function(n){const o=document.createElement("li"),r=document.createElement("a");return e.listItemClass&&o.setAttribute("class",e.listItemClass),e.onClick&&(r.onclick=e.onClick),e.includeTitleTags&&r.setAttribute("title",n.textContent),e.includeHtml&&n.childNodes.length?t.call(n.childNodes,(e=>{r.appendChild(e.cloneNode(!0))})):r.textContent=n.textContent,r.setAttribute("href",`${e.basePath}#${n.id}`),r.setAttribute("class",`${e.linkClass+l}node-name--${n.nodeName}${l}${e.extraLinkClasses}`),o.appendChild(r),o}(n));if(n.children.length){const e=a(n.isCollapsed);n.children.forEach((t=>{c(t,e)})),r.appendChild(e)}}function a(t){const n=e.orderedList?"ol":"ul",o=document.createElement(n);let r=e.listClass+l+e.extraListClasses;return t&&(r=r+l+e.collapsibleClass,r=r+l+e.isCollapsedClass),o.setAttribute("class",r),o}function d(t){let n=0;return null!==t&&(n=t.offsetTop,e.hasInnerContainers&&(n+=d(t.offsetParent))),n}function u(e,t){return e&&e.className!==t&&(e.className=t),e}function f(t){return t&&-1!==t.className.indexOf(e.collapsibleClass)&&-1!==t.className.indexOf(e.isCollapsedClass)?(u(t,t.className.replace(l+e.isCollapsedClass,"")),f(t.parentNode.parentNode)):t}function m(t){const n=p(),o=document?.getElementById(t);return o.offsetTop>n.offsetHeight-1.4*n.clientHeight-e.bottomModeThreshold}function h(){const t=p(),n=t.scrollHeight>t.clientHeight,o=g()+t.clientHeight>t.offsetHeight-e.bottomModeThreshold;return n&&o}function p(){let t;return t=e.scrollContainer&&document.querySelector(e.scrollContainer)?document.querySelector(e.scrollContainer):document.documentElement||o,t}function g(){const e=p();return e?.scrollTop||0}function C(t,o=g()){let l;return n.call(t,((n,r)=>d(n)>o+e.headingsOffset+10?(l=t[0===r?r:r-1],!0):r===t.length-1?(l=t[t.length-1],!0):void 0)),l}return{enableTocAnimation:function(){s=!0},disableTocAnimation:function(t){const n=t.target||t.srcElement;"string"==typeof n.className&&-1!==n.className.indexOf(e.linkClass)&&(s=!1)},render:function(e,t){const n=a(!1);if(t.forEach((e=>{c(e,n)})),r=e||r,null!==r)return r.firstChild&&r.removeChild(r.firstChild),0===t.length?r:r.appendChild(n)},updateToc:function(n,o){e.positionFixedSelector&&function(){const t=g(),n=document.querySelector(e.positionFixedSelector);"auto"===e.fixedSidebarOffset&&(e.fixedSidebarOffset=r.offsetTop),t>e.fixedSidebarOffset?-1===n.className.indexOf(e.positionFixedClass)&&(n.className+=l+e.positionFixedClass):n.className=n.className.replace(l+e.positionFixedClass,"")}();const c=n,a=o?.target?.getAttribute?o?.target?.getAttribute("href"):null,d=!(!a||"#"!==a.charAt(0))&&m(a.replace("#",""));if(o&&i<5&&i++,(s||d)&&r&&c.length>0){const n=C(c),o=r.querySelector(`.${e.activeLinkClass}`),s=n.id.replace(/([ #;&,.+*~':"!^$[\]()=>|/\\@])/g,"\\$1"),p=window.location.hash.replace("#","");let g=s;const b=h();a&&d?g=a.replace("#",""):p&&p!==s&&b&&(m(s)||i<=2)&&(g=p);const S=r.querySelector(`.${e.linkClass}[href="${e.basePath}#${g}"]`);if(o===S)return;const y=r.querySelectorAll(`.${e.linkClass}`);t.call(y,(t=>{u(t,t.className.replace(l+e.activeLinkClass,""))}));const v=r.querySelectorAll(`.${e.listItemClass}`);t.call(v,(t=>{u(t,t.className.replace(l+e.activeListItemClass,""))})),S&&-1===S.className.indexOf(e.activeLinkClass)&&(S.className+=l+e.activeLinkClass);const T=S?.parentNode;T&&-1===T.className.indexOf(e.activeListItemClass)&&(T.className+=l+e.activeListItemClass);const w=r.querySelectorAll(`.${e.listClass}.${e.collapsibleClass}`);t.call(w,(t=>{-1===t.className.indexOf(e.isCollapsedClass)&&(t.className+=l+e.isCollapsedClass)})),S?.nextSibling&&-1!==S.nextSibling.className.indexOf(e.isCollapsedClass)&&u(S.nextSibling,S.nextSibling.className.replace(l+e.isCollapsedClass,"")),f(S?.parentNode.parentNode)}},getCurrentlyHighlighting:function(){return s},getTopHeader:C,getScrollTop:g,updateUrlHashForHeader:function(e){const t=g(),n=C(e,t),o=h();if(n&&!(t<5)||o){if(n&&!o){const e=`#${n.id}`;window.location.hash!==e&&window.history.pushState(null,null,e)}}else"#"!==window.location.hash&&""!==window.location.hash&&window.history.pushState(null,null,"#")}}}e.r(t),e.d(t,{_buildHtml:()=>r,_headingsArray:()=>i,_options:()=>d,_parseContent:()=>s,_scrollListener:()=>c,default:()=>C,destroy:()=>f,init:()=>u,refresh:()=>m});const o={tocSelector:".js-toc",tocElement:null,contentSelector:".js-toc-content",contentElement:null,headingSelector:"h1, h2, h3",ignoreSelector:".js-toc-ignore",hasInnerContainers:!1,linkClass:"toc-link",extraLinkClasses:"",activeLinkClass:"is-active-link",listClass:"toc-list",extraListClasses:"",isCollapsedClass:"is-collapsed",collapsibleClass:"is-collapsible",listItemClass:"toc-list-item",activeListItemClass:"is-active-li",collapseDepth:0,scrollSmooth:!0,scrollSmoothDuration:420,scrollSmoothOffset:0,scrollEndCallback:function(e){},headingsOffset:1,throttleTimeout:50,positionFixedSelector:null,positionFixedClass:"is-position-fixed",fixedSidebarOffset:"auto",includeHtml:!1,includeTitleTags:!1,onClick:function(e){},orderedList:!0,scrollContainer:null,skipRendering:!1,headingLabelCallback:!1,ignoreHiddenElements:!1,headingObjectCallback:null,basePath:"",disableTocScrollSync:!1,tocScrollingWrapper:null,tocScrollOffset:30,enableUrlHashUpdateOnScroll:!1,bottomModeThreshold:30};function l(e){var t=e.duration,n=e.offset;if("undefined"!=typeof window&&"undefined"!=typeof location){var o=location.hash?l(location.href):location.href;document.body.addEventListener("click",(function(r){var s;"a"!==(s=r.target).tagName.toLowerCase()||!(s.hash.length>0||"#"===s.href.charAt(s.href.length-1))||l(s.href)!==o&&l(s.href)+"#"!==o||r.target.className.indexOf("no-smooth-scroll")>-1||"#"===r.target.href.charAt(r.target.href.length-2)&&"!"===r.target.href.charAt(r.target.href.length-1)||-1===r.target.className.indexOf(e.linkClass)||function(e,t){var n,o,l=window.pageYOffset,r={duration:t.duration,offset:t.offset||0,callback:t.callback,easing:t.easing||function(e,t,n,o){return(e/=o/2)<1?n/2*e*e+t:-n/2*(--e*(e-2)-1)+t}},s=document.querySelector('[id="'+decodeURI(e).split("#").join("")+'"]')||document.querySelector('[id="'+e.split("#").join("")+'"]'),i="string"==typeof e?r.offset+(e?s&&s.getBoundingClientRect().top||0:-(document.documentElement.scrollTop||document.body.scrollTop)):e,c="function"==typeof r.duration?r.duration(i):r.duration;function a(e){o=e-n,window.scrollTo(0,r.easing(o,l,i,c)),o0&&(c=n(i),!c||s!==c.headingLevel);)c&&void 0!==c.children&&(i=c.children),a--;s>=e.collapseDepth&&(r.isCollapsed=!0),i.push(r)}(r,t.nest),t}),{nest:[]})},selectHeadings:function(t,n){let o=n;e.ignoreSelector&&(o=n.split(",").map((function(t){return`${t.trim()}:not(${e.ignoreSelector})`})));try{return t.querySelectorAll(o)}catch(e){return console.warn(`Headers not found with selector: ${o}`),null}}}}(d),f();const u=function(e){try{return e.contentElement||document.querySelector(e.contentSelector)}catch(t){return console.warn(`Contents element not found: ${e.contentSelector}`),null}}(d);if(null===u)return;const m=g(d);if(null===m)return;if(i=s.selectHeadings(u,d.headingSelector),null===i)return;const C=s.nestHeadingsArray(i).nest;if(d.skipRendering)return this;r.render(m,C);let b=!1;c=p((e=>{r.updateToc(i,e),!d.disableTocScrollSync&&!b&&function(e){const t=e.tocScrollingWrapper||e.tocElement||document.querySelector(e.tocSelector);if(t&&t.scrollHeight>t.clientHeight){const n=t.querySelector(`.${e.activeListItemClass}`);if(n){const o=n.offsetTop-e.tocScrollOffset;t.scrollTop=o>0?o:0}}}(d),d.enableUrlHashUpdateOnScroll&&t&&r.getCurrentlyHighlighting()&&r.updateUrlHashForHeader(i);const n=e?.target?.scrollingElement&&0===e.target.scrollingElement.scrollTop;(e&&(0===e.eventPhase||null===e.currentTarget)||n)&&(r.updateToc(i),d.scrollEndCallback&&d.scrollEndCallback(e))}),d.throttleTimeout),t||(c(),t=!0),window.onhashchange=window.onscrollend=e=>{c(e)},d.scrollContainer&&document.querySelector(d.scrollContainer)?(document.querySelector(d.scrollContainer).addEventListener("scroll",c,!1),document.querySelector(d.scrollContainer).addEventListener("resize",c,!1)):(document.addEventListener("scroll",c,!1),document.addEventListener("resize",c,!1));let S=null;a=p((e=>{b=!0,d.scrollSmooth&&r.disableTocAnimation(e),r.updateToc(i,e),S&&clearTimeout(S),S=setTimeout((()=>{r.enableTocAnimation()}),d.scrollSmoothDuration),setTimeout((()=>{b=!1}),d.scrollSmoothDuration+100)}),d.throttleTimeout),d.scrollContainer&&document.querySelector(d.scrollContainer)?document.querySelector(d.scrollContainer).addEventListener("click",a,!1):document.addEventListener("click",a,!1)}function f(){const e=g(d);null!==e&&(d.skipRendering||e&&(e.innerHTML=""),d.scrollContainer&&document.querySelector(d.scrollContainer)?(document.querySelector(d.scrollContainer).removeEventListener("scroll",c,!1),document.querySelector(d.scrollContainer).removeEventListener("resize",c,!1),r&&document.querySelector(d.scrollContainer).removeEventListener("click",a,!1)):(document.removeEventListener("scroll",c,!1),document.removeEventListener("resize",c,!1),r&&document.removeEventListener("click",a,!1)))}function m(e){f(),u(e||d)}const h=Object.prototype.hasOwnProperty;function p(e,t,n){let o,l;return t||(t=250),function(...r){const s=n||this,i=+new Date;o&&i{o=i,e.apply(s,r)}),t)):(o=i,e.apply(s,r))}}function g(e){try{return e.tocElement||document.querySelector(e.tocSelector)}catch(t){return console.warn(`TOC element not found: ${e.tocSelector}`),null}}const C={_options:d,_buildHtml:r,_parseContent:s,init:u,destroy:f,refresh:m};var b,S;b="undefined"!=typeof global?global:window||global,S=function(e){const n=!!(e&&e.document&&e.document.querySelector&&e.addEventListener);if("undefined"!=typeof window||n)return e.tocbot=t,t},"function"==typeof define&&define.amd?define([],S(b)):"object"==typeof exports?module.exports=S(b):b.tocbot=S(b)})();
\ No newline at end of file