aboutsummaryrefslogtreecommitdiff
path: root/templates/partials/doc/page_toc_script.html
diff options
context:
space:
mode:
Diffstat (limited to 'templates/partials/doc/page_toc_script.html')
-rw-r--r--templates/partials/doc/page_toc_script.html57
1 files changed, 57 insertions, 0 deletions
diff --git a/templates/partials/doc/page_toc_script.html b/templates/partials/doc/page_toc_script.html
new file mode 100644
index 0000000..efe4bac
--- /dev/null
+++ b/templates/partials/doc/page_toc_script.html
@@ -0,0 +1,57 @@
+<script>
+
+const menuBarHeight = document.querySelector("nav.navbar").clientHeight;
+const mainTocMenuWidth = document.getElementById('main-toc-menu').clientWidth;
+const tocItems = document.querySelectorAll(".toc");
+const navSections = new Array(tocItems.length);
+
+// Page content
+/*
+ Focus effect on current section anchor when user scrolls.
+*/
+
+tocItems.forEach((el, i) => {
+ let id = el.getAttribute("id").substring(5);
+ navSections[i] = document.getElementById(id);
+})
+
+function isVisible(tocIndex) {
+ const current = navSections[tocIndex];
+ const next = tocIndex < tocItems.length - 1 ? navSections[tocIndex + 1]
+ : document.querySelectorAll("section.section").item(1);
+
+ const c = current.getBoundingClientRect();
+ if (next) {
+ const n = next.getBoundingClientRect();
+ const h = (window.innerHeight || document.documentElement.clientHeight);
+
+ return (c.top <= h) && (n.top - menuBarHeight >= 0);
+ } else {
+ const h = (window.innerHeight || document.documentElement.clientHeight);
+
+ return (c.top <= h);
+ }
+}
+
+function activateIfVisible() {
+ for (b = true, i = 0; i < tocItems.length; i++) {
+ if (b && isVisible(i)) {
+ tocItems[i].classList.add('is-active');
+ b = false;
+ } else
+ tocItems[i].classList.remove('is-active');
+ }
+}
+
+var isTicking = null;
+window.addEventListener('scroll', () => {
+ if (!isTicking) {
+ window.requestAnimationFrame(() => {
+ activateIfVisible();
+ isTicking = false;
+ });
+ isTicking = true;
+ }
+}, false);
+
+</script>